我对编程(以及使用Python)相当新,而stackoverflow问题/响应系统允许我解决我所有的问题,直到现在。但是,我没有找到任何直接解决我当前问题的帖子,但不得不承认我真的不知道什么是错的。让我解释一下。
我正在尝试使用Pyinstaller创建.py文件的可执行文件。使用简单的.py程序(使用--onefile)进行此操作没有问题,但是当涉及使用其他.py和.txt文件的更复杂的程序时,它不起作用。我知道我需要修改spec文件并尝试了许多替代方案;例如,添加隐藏文件。
以下是文件:
以下.txt文件由UpdatingStrategy.py
读取我正在使用python3.5和Windows 10.如果您需要额外信息,请告诉我。
有人可以告诉我如何正确使用spec文件并修改它以生成UpdatingStrategy.py的可执行文件吗?我之前已经阅读过Pyinstaller文档,但是我缺乏许多关键原则而无法使其工作。
答案 0 :(得分:6)
a = Analysis( ... )
添加
a.datas += [
("/absolute/path/to/some.txt","txt_files/some.txt","DATA"),
("/absolute/path/to/some2.txt","txt_files/some2.txt","DATA"),
("/absolute/path/to/some3.txt","txt_files/some3.txt","DATA"),
]
然后在您的程序中使用以下命令获取txt文件的资源路径
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.environ.get("_MEIPASS2",os.path.abspath("."))
return os.path.join(base_path, relative_path)
...
txt_data = open(resource_path("txt_files/some.txt")).read()
确保你像python -m PyInstaller my_target.spec
一样构建它...在编辑spec文件后不要直接针对.py文件调用pyinstaller,否则它将覆盖你编辑的文件...
答案 1 :(得分:0)
任何人在 2021 年读到这篇文章......我刚刚在 Pyinstaller 上遇到了类似的问题。需要在我的 python 代码中添加一个文本文件:
pyinstaller --add-data "/my/path/to/mytextfile.txt:/path/mytextfile.txt" mypython.py --onedir or --onefile
无论是onedir还是onefile,我的代码都没有找到文本文件。事实上它抛出了错误:
IsADirectoryError: [Errno 21] Is a directory: /path/mytextfile.txt
这对我来说没有意义,因为那是文件而不是文件夹。只有当我使用 --onedir 标志检查并遵循路径时,我才意识到 pyinstaller 不仅会创建文件夹路径,还会创建文件夹 mytextfile.txt 并将 mytextfile.txt 放在那里......所以真的 - add-data 标志只需要目标文件夹而不是文件路径。
pyinstaller --add-data "/my/path/to/mytextfile.txt:path" mypython.py
或在规范文件中,即 mypython.spec
datas=[('/my/path/to/mytextfile.txt', 'path')]
应该解决这个问题。另请注意,spec 文件中的“DATA”配置已消失。