PyInstaller.spec
文件可以在它支持的三个平台上移植:Windows、Mac OS X 和 Linux。
.spec
我发现生成文件一次并在从中构建可执行文件之前随意修改它要容易得多。
在 Internet 上的每个示例(例如这个)中,该文件将始终为ANALYSIS 部分中.spec
的参数定义一个绝对路径。pathex
这使得构建不可移植,因为绝对路径不仅特定于运行构建的机器,还特定于平台。
这总是必须是绝对路径还是有办法让它完全可移植?
PyInstaller.spec
文件可以在它支持的三个平台上移植:Windows、Mac OS X 和 Linux。
.spec
我发现生成文件一次并在从中构建可执行文件之前随意修改它要容易得多。
在 Internet 上的每个示例(例如这个)中,该文件将始终为ANALYSIS 部分中.spec
的参数定义一个绝对路径。pathex
这使得构建不可移植,因为绝对路径不仅特定于运行构建的机器,还特定于平台。
这总是必须是绝对路径还是有办法让它完全可移植?
如果您将.spec
文件放在其默认位置,您可以简单地pathex
从规范中删除,因为'current directory'
和'your-configured-pathex-here'
是相同的。
解释
pathex
是之前要搜索的路径的可选列表sys.path
来源:https ://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/building/build_main.py#L123
规范文件实际上是可执行的 Python 代码。PyInstaller 通过执行规范文件的内容来构建应用程序。
来源:https ://github.com/pyinstaller/pyinstaller/blob/develop/doc/spec-files.rst#using-spec-files
这得出的结论是,您应该能够像这样对三个环境的每条路径进行硬编码
pathex=["/Users/fatuhoku/Python/myapp", "C:\\Python\\myapp", "/home/fatuhoku/Python/myapp"],
或者调用一个手工编织的 Python 函数,它只返回一个包含单个元素的列表,即当前工作目录。
如果您运行 PyInstaller,它会告诉您如下信息:
46 INFO: Extending PYTHONPATH with paths
['current directory', 'your-configured-pathex-here']
正如其他人所指出的,该.spec
文件是 Python 代码。您想要的是pathex
成为当前执行代码的机器上的绝对路径。您可以借助文件SPECPATH
中定义的全局变量来完成此.spec
操作。(在此处查看PyInstaller 文档中列出的所有可用全局变量。)
在我们的例子中,我使用了:
import os
spec_root = os.path.abspath(SPECPATH)
...
pathex=[spec_root]
如果您.spec
与您的包/脚本不在同一目录中,您可以使用os.path.abspath(os.path.join(SPECPATH, '..'))
或类似的东西从您的规范文件中找到您的 pathex。
pathex 现在似乎已转换为绝对路径列表,如果它还不是的话。
请参阅PyInstaller build.py 行 #426
.spec 文件当然是可移植的,因为它实际上是 Python 源代码。:) 因此,您可以在 .spec 文件中编写所需的任何逻辑。
例如,我的规范文件调用排除了大部分编码的帮助程序。* 我不关心的数据、_ssl 等...