Pyinstaller无法添加.txt文件

时间:2016-10-05 23:45:34

标签: python python-3.x pyinstaller

我对编程(以及使用Python)相当新,而stackoverflow问题/响应系统允许我解决我所有的问题,直到现在。但是,我没有找到任何直接解决我当前问题的帖子,但不得不承认我真的不知道什么是错的。让我解释一下。

我正在尝试使用Pyinstaller创建.py文件的可执行文件。使用简单的.py程序(使用--onefile)进行此操作没有问题,但是当涉及使用其他.py和.txt文件的更复杂的程序时,它不起作用。我知道我需要修改spec文件并尝试了许多替代方案;例如,添加隐藏文件。

以下是文件:

  • UpdatingStrategy.py (要转换为可执行文件的目标文件)
  • LPRfunctions.py(UpdatingStrategy.py从此文件导入函数)

以下.txt文件由UpdatingStrategy.py

读取
  • Strategy_Observ.txt
  • Strategy_Problems.txt
  • Updating_Observ1.txt
  • Updating_Observ2.txt
  • Updating_Problems.txt

我正在使用python3.5和Windows 10.如果您需要额外信息,请告诉我。

有人可以告诉我如何正确使用spec文件并修改它以生成UpdatingStrategy.py的可执行文件吗?我之前已经阅读过Pyinstaller文档,但是我缺乏许多关键原则而无法使其工作。

2 个答案:

答案 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”配置已消失。