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

时间:2013-10-23 15:51:31

标签: python pyinstaller

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

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

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

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

3 个答案:

答案 0 :(得分:7)

如果您将.spec文件放在默认位置,则只需从规范中删除pathex,因为'current directory''your-configured-pathex-here'相同。

<强>解释

  

pathexsys.path

之前要搜索的路径的可选列表

来源: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"],

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

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

46 INFO: Extending PYTHONPATH with paths
['current directory', 'your-configured-pathex-here']

答案 1 :(得分:3)

正如其他人所指出的,.spec文件是Python代码。你想要的是pathex是当前执行代码的机器上的绝对路径。您可以借助SPECPATH文件中定义的.spec全局变量来完成此操作。 (请参阅PyInstaller docs here中列出的所有可用全局变量。)

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

import os

spec_root = os.path.abspath(SPECPATH)

...

pathex=[spec_root]

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

答案 2 :(得分:2)

现在,pathex似乎被转换为绝对路径列表(如果它已经不存在)。

请参阅PyInstaller build.py line #426

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

例如,我的s​​pec文件调用了helper例程,这些例程排除了我不关心的大部分编码。*数据,_ssl等......