我有一个python程序,将两个文本文件作为输入。我已经使用pyinstaller将这个python程序(一个.py文件)转换为一个.exe文件。 .exe文件在运行时给出FileNotFoundError。但是,将.txt文件复制到存在.exe的路径时,它可以正常工作。我的意图是不复制.txt文件,而是将.txt文件与.exe捆绑在一起,以便无法访问.txt文件。我想将所有.txt文件依赖项与.exe捆绑在一起,最终应该只有一个.exe文件,当我运行它时,它的工作方式应与运行python程序时相同。请建议我达到相同目的的方法
我是pyinstaller的新手。我曾尝试将.txt文件添加到.spec文件中的data参数。但这无法将文本文件复制到存在我的.exe的dist文件夹中。但是正如我提到的,我只需要一个.exe文件。即使将.exe文件与无法访问任何文本文件的其他人共享,该.exe也必须成功运行]
a.datas + = [('D:/Trial/src/readme_text_files/readme2.txt ','readme_text_files / readme2.txt','readme_text_files'),]
以上代码已添加到.spec文件,因此,我认为在运行时,必须将readme_text_files复制到存在.exe的文件夹中:pyinstaller spec_filename.spec
我希望将.txt文件与.exe文件捆绑在一起,因此我执行了以下操作:
我以下列方式编辑了.spec文件:
a = Analysis(['mainProgram_edited_for_datas.py'],
pathex=['D:\\Trial\\src'],
binaries=[],
datas=[
('D:/Trial/src/readme_text_files/readme1.txt','readme_text_files'),
('D:/Trial/src/readme_text_files/readme2.txt','readme_text_files'),
], ...........(Rest of the .spec file contents as it is)
或者简单地,您可以直接包含目录本身,如下所示:
datas=[('C:/Users/njv5kor/eclipse-workspace/Trial/src/readme_text_files/','readme_text_files'),
],
在python代码中,我添加了以下代码:
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
file = resource_path("readme_text_files\\readme1.txt")
基本上pyinstaller会将.txt文件捆绑到.py文件,并创建一个.exe文件。有关_MEIPASS plese的详细信息,请参见链接:https://pyinstaller.readthedocs.io/en/v3.3.1/operating-mode.html#how-the-one-file-program-works