【发布时间】:2020-07-11 05:21:07
【问题描述】:
我到处查找,但对一个相当琐碎的问题没有明确的答复。
我在 Windows 7 上的 PyCharm 中有一个 Python 项目,其中包含多个 .py 文件(通过“from %package_name%.%script_name% import %class_name%”连接)和项目内的一个文件夹,其中包含两个简单的文本文件。我已将 PyInstaller 3.6 安装到项目的 venv 中,并将其用作外部工具,指向 .spec 文件。到目前为止,一切都很好。 .spec文件如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['C:\\Users\\%username%\\PycharmProjects\\%project_folder%\\%project_folder%\\main.py'],
pathex=['C:\\Users\\%username%\\PycharmProjects\\%project_folder%\\%project_folder%'],
binaries=[],
datas=[('txt_files\\file1.txt', '.'), ('txt_files\\file2.txt', '.')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas += [
("C:\\Users\\%username%\\PycharmProjects\\%project_folder%\\%project_folder%\\txt_files\\file1.txt","txt_files\\file1.txt","DATA"),
("C:\\Users\\%username%\\PycharmProjects\\%project_folder%\\%project_folder%\\txt_files\\file2.txt","txt_files\\file2.txt","DATA"),
]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='%project_name%',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='%project_name%')
问题在于,如果我在脚本本身中对捆绑的.txt 文件的绝对路径进行硬编码,则应用程序可以编译并且没有运行时错误。但是,如果我在脚本中使用相对路径,则应用程序会编译,但会出现运行时错误,即在/build(或/dist)内部找不到.txt 文件(即file1.txt),我这里可能是错误的)目录(显然不存在)。
当然,对绝对路径进行硬编码是一种不好的做法,尤其是在谈论到另一台机器的可移植性以及使应用程序跨平台时。我知道构建过程可能取决于sys._MEIPASS,但我不知道如何在我的上下文中使用它。
我应该在哪个脚本(main、.spec 或其他?)中放置使用sys._MEIPASS 获取捆绑文件的绝对路径的部分?这个代码部分在 Python 3.7 上应该是什么样子?我已经看到了不同的答案(即this one)并且已经尝试过,但在我的情况下似乎都没有。
【问题讨论】:
-
您是捆绑到一个可执行文件(带有
--onedir)还是一个目录? -
是的,我想生成一个捆绑的可执行文件,但是当我通过
--onedir选项时,我收到了错误Security-Alert: try to store file outside of dist-directory. Aborting.。现在,为了在代码中获取在venv中工作的路径,我使用file_path = os.path.abspath(os.path.join(os.getcwd(), rel_path)),其中rel_path是txt_files\\file1.txt,它在PyCharm 中工作,但是,当运行应用程序本身时,它会生成一个@ 987654344@ 在C:\\Users\\%username%\\PycharmProjects\\%project_folder%\\%project_folder%\\dist\\%project_folder%\\txt_files\\file1.txt。
标签: python build exe pyinstaller