4

我有一个 python 程序,它接受两个文本文件作为输入。我已经使用 pyinstaller 将此 python 程序(一个 .py 文件)转换为一个 .exe 文件。运行时的 .exe 文件给出 FileNotFoundError。但是,当 .txt 文件被复制到 .exe 所在的路径时,它可以正常工作。我的意图是不复制 .txt 文件,而是将 .txt 文件与 .exe 捆绑在一起,以使 .txt 文件无法访问。我想将所有 .txt 文件依赖项与 .exe 捆绑在一起,最终应该只有一个 .exe 文件,当我运行它时,它的工作方式应该与我运行 python 程序时相同。请建议我实现相同目标的方法

我是 pyinstaller 的新手。我曾尝试将 .txt 文件添加到 .spec 文件中的数据参数。但这无法将文本文件复制到我的 .exe 所在的 dist 文件夹中。但正如我所提到的,我只需要 .exe 文件。即使 .exe 文件共享给无权访问任何文本文件的其他人,该 .exe 也必须成功运行

a.datas+=[('D:/Trial/src/readme_text_files/readme1.txt','readme_text_files/readme1.txt','readme_text_files'), ('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

4

1 回答 1

1

我希望将 .txt 文件与 .exe 文件捆绑在一起,因此我执行了以下操作:

  1. 我按以下方式编辑了 .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'),
                        ],
    
  2. 在 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 的详细信息,请参阅链接: https ://pyinstaller.readthedocs.io/en/v3.3.1/operating-mode.html#how -the-one-file-program-works

于 2019-10-20T14:45:25.093 回答