【问题标题】:PyInstaller cannot add .txt filesPyInstaller 无法添加 .txt 文件
【发布时间】:2016-10-05 23:45:34
【问题描述】:

我对编程(和 Python)还很陌生,而 Stack Overflow 问题/响应系统让我能够解决到目前为止的所有问题。我没有找到任何直接解决我当前问题的帖子,但不得不承认我真的不知道出了什么问题。让我解释一下。

我正在尝试使用 PyInstaller 制作 *.py 脚本的可执行文件。使用简单的 Python 脚本(使用 --onefile)执行此操作没有问题,但是当涉及使用其他 *.py*.txt 文件的更复杂的程序时,它不起作用。我知道我需要修改规范文件并尝试了许多替代方法 - 例如添加隐藏文件。

这里是文件:

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

UpdatingStrategy.py 读取以下*.txt 文件:

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

我使用的是 Python 3.5 和 Windows 10。如果您需要更多信息,请告诉我。

如何正确使用规范文件并对其进行修改以制作UpdatingStrategy.py的可执行文件?

我已经阅读了 PyInstaller 文档,但我缺乏许多关键原则,无法使其发挥作用。

【问题讨论】:

    标签: python python-3.x pyinstaller


    【解决方案1】:

    行后

    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,否则它将覆盖您编辑的文件...

    【讨论】:

    • 你或许能帮我解决我的problem
    • 正如 lema 在他的回答中解释的那样,PyInstaller 的行为发生了变化。现在数据元组只包含(source_path, dest_dir)。因此,考虑到同一文件夹中的数据和 .spec,您可以只写 a.datas += [ ("some.txt",".")]。另请注意,仍然需要在运行时调整 resource_path
    【解决方案2】:

    任何人在 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”配置已消失。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2022-01-04
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2022-10-17
      • 2021-03-25
      • 2020-09-12
      相关资源
      最近更新 更多