PyInstaller 无法添加 .txt 文件
PyInstaller cannot add .txt files
我对编程(以及 Python)还很陌生,Stack Overflow question/response 系统让我解决了所有问题,直到现在。我没有找到任何 post 直接解决我当前的问题,但不得不承认我真的不知道哪里出了问题。让我解释一下。
我正在尝试使用 PyInstaller 创建 *.py
脚本的可执行文件。使用简单的 Python 脚本(使用 --onefile)执行它没有问题,但是当涉及到使用其他 *.py
和 *.txt
文件的更复杂的程序时,它就不起作用了。我知道我需要修改规范文件并尝试了很多替代方案 - 例如添加隐藏文件。
文件如下:
UpdatingStrategy.py
(转换为可执行文件的目标文件)
LPRfunctions.py
(UpdatingStrategy.py
从该文件导入函数)
以下 *.txt
个文件被 UpdatingStrategy.py
读取:
Strategy_Observ.txt
Strategy_Problems.txt
Updating_Observ1.txt
Updating_Observ2.txt
Updating_Problems.txt
我正在使用 Python 3.5 和 Windows 10。如果您需要更多信息,请告诉我。
如何正确使用规范文件并修改它以制作UpdatingStrategy.py
的可执行文件?
我已经阅读了 PyInstaller 文档,但我缺少许多关键原则,因此无法正常工作。
行后
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
的方式构建它...不要在编辑规范文件后直接针对您的 .py 文件调用 PyInstaller,否则它会覆盖您编辑的文件...
任何在 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')]
应该解决这个问题。另请注意,规范文件中的“DATA”配置已消失。
我对编程(以及 Python)还很陌生,Stack Overflow question/response 系统让我解决了所有问题,直到现在。我没有找到任何 post 直接解决我当前的问题,但不得不承认我真的不知道哪里出了问题。让我解释一下。
我正在尝试使用 PyInstaller 创建 *.py
脚本的可执行文件。使用简单的 Python 脚本(使用 --onefile)执行它没有问题,但是当涉及到使用其他 *.py
和 *.txt
文件的更复杂的程序时,它就不起作用了。我知道我需要修改规范文件并尝试了很多替代方案 - 例如添加隐藏文件。
文件如下:
UpdatingStrategy.py
(转换为可执行文件的目标文件)LPRfunctions.py
(UpdatingStrategy.py
从该文件导入函数)
以下 *.txt
个文件被 UpdatingStrategy.py
读取:
Strategy_Observ.txt
Strategy_Problems.txt
Updating_Observ1.txt
Updating_Observ2.txt
Updating_Problems.txt
我正在使用 Python 3.5 和 Windows 10。如果您需要更多信息,请告诉我。
如何正确使用规范文件并修改它以制作UpdatingStrategy.py
的可执行文件?
我已经阅读了 PyInstaller 文档,但我缺少许多关键原则,因此无法正常工作。
行后
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
的方式构建它...不要在编辑规范文件后直接针对您的 .py 文件调用 PyInstaller,否则它会覆盖您编辑的文件...
任何在 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')]
应该解决这个问题。另请注意,规范文件中的“DATA”配置已消失。