【问题标题】:How can I make PyInstaller's .spec files actually portable? (woes absolute path for 'pathex' parameter)如何使 PyInstaller 的 .spec 文件真正可移植? ('pathex' 参数的绝对路径问题)
【发布时间】:2013-11-02 00:18:42
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python pyinstaller


    【解决方案1】:

    如果您将.spec 文件放在其默认位置,您可以简单地从规范中删除pathex,因为'current directory' 和'your-configured-pathex-here' 是相同的。

    说明

    pathex 是在sys.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']
    

    【讨论】:

    • 您应该将最后一句话放在答案的开头,或者至少突出显示它。一旦我读到了,我就不需要其他任何东西了。
    【解决方案2】:

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

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

    import os
    
    spec_root = os.path.abspath(SPECPATH)
    
    ...
    
    pathex=[spec_root]
    

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

    【讨论】:

      【解决方案3】:

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

      见PyInstaller build.py line #426

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

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

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2021-02-06
      • 1970-01-01
      相关资源
      最近更新 更多