如何使PyInstaller的.spec文件实际上可移植?('pathex'参数的绝对路径)

fat*_*oku 8 python pyinstaller

PyInstaller .spec文件意味着可以在它支持的三个平台上移植:Windows,Mac OS X和Linux.

我发现生成.spec文件一次并在从中构建可执行文件之前随意修改它会容易得多.

在因特网上的每个示例中(例如,这一个),.spec文件将始终为pathexANALYSIS部分中的参数定义绝对路径.这使得构建不可移植,因为绝对路径不仅特定于构建运行的机器,而且特定于平台.

这总是必须是绝对的路径还是有办法让它完全可移植?

Mar*_*tör 10

.spec 是以前要搜索的路径的可选列表 pathex

资料来源:https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/building/build_main.py#L123

spec文件实际上是可执行的Python代码.PyInstaller通过执行spec文件的内容来构建应用程序.

资料来源: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"],
Run Code Online (Sandbox Code Playgroud)

或者调用一个手工编写的Python函数,它只返回一个包含当前工作目录的单个元素的列表.

如果你运行PyInstaller它会告诉你这样的事情:

46 INFO: Extending PYTHONPATH with paths
['current directory', 'your-configured-pathex-here']
Run Code Online (Sandbox Code Playgroud)

如果您将'current directory'文件默认位置,你可以简单地删除'your-configured-pathex-here'从规范,因为pathexsys.path是相同的反正.

  • 你应该把最后一句放在答案的开头,或至少把它放在高位.一旦我读到它,我就不需要别的了. (4认同)

Jua*_*uan 7

正如其他人指出的那样,该.spec文件是 Python 代码。您想要的是pathex成为当前执​​行代码的机器上的绝对路径。您可以借助文件中SPECPATH定义的全局变量来执行此.spec操作。(在此处查看PyInstaller 文档中列出的所有可用全局变量。)

在我们的例子中,我使用了:

import os

spec_root = os.path.abspath(SPECPATH)

...

pathex=[spec_root]
Run Code Online (Sandbox Code Playgroud)

如果您.spec的包/脚本不在同一目录中,您可以使用os.path.abspath(os.path.join(SPECPATH, '..'))或类似的方法从您的规范文件中找到您的 pathex。


小智 2

pathex 现在似乎已转换为绝对路径列表(如果还不是绝对路径列表)。

请参阅PyInstaller build.py 行 #426

.spec 文件当然是可移植的,因为它实际上是 Python 源代码。:) 所以你可以在 .spec 文件中编写你需要的任何逻辑。

例如,我的规范文件调用排除大部分我不关心的编码数据、_ssl 等的辅助例程...