【问题标题】:pyinstaller with namespace packages带有命名空间包的 pyinstaller
【发布时间】:2015-08-04 02:46:01
【问题描述】:

我有一个模块/包结构,我在其中使用命名空间包,我有多个用户制作的库,我将它们保存在单独的存储库中,并且它们具有相当通用的名称,例如 db、io、utils 等。为了避免与其他包冲突,我有一个名为 acme 的顶级/命名空间包,即我的包是 acme.io、acme.db、acme.utils 等。为了使这项工作,所有 acme 文件夹中的 __init__.py 具有以下几行

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

这在运行从 python 中使用这些包的软件时效果很好。

然后我尝试使用 pyinstaller 制作 EXE。 pyinstaller 只找到其中​​一个包。我尝试将 pathex 设置为每个库所在的文件夹:

a = Analysis(['.\\src\\myPgogram.py'],
         pathex=['C:\\Data\\python\\myProgram', 'C:\\Data\python\\dbrepo', 'C:\\Data\\python\\utilsrepo', 'C:\\Data\\python\\iorepo'],
         hiddenimports=['acme', 'acme.io', 'acme.utils', 'acme.db'],
         hookspath=None,
         runtime_hooks=None)

在dbrepo、iorepo和utilsrepo文件夹中有一个名为acme的文件夹,里面有上面提到的__init__.py文件和对应的包,即db、utils和io,里面又多了一个__init__.py文件。

但是 pyinstaller 只能找到 acme 和 acme.db 包。或者它只查找 pathex 变量中首先列出路径的包。

有什么提示可以让我完成这项工作吗?

谢谢

【问题讨论】:

    标签: python namespaces package pyinstaller namespace-package


    【解决方案1】:

    我也遇到了同样的问题。查了一下:http://pythonhosted.org/PyInstaller/#extending-the-path 并在我的构建批处理文件调用中添加了一些--paths

    类似于:

    @echo off
    echo ========= %~n0 =========
    
    set pyfile=scriptName.py
    set pypath=C:\Python27\Scripts
    set buildpath=%temp%
    set distpath=%~dp0
    
    %pypath%\pyinstaller.exe --onefile -y %~dp0%pyfile% --distpath=%distpath% --workpath=%buildpath% --specpath=%buildpath% --noupx --paths=D:\Tools\dev\python --paths=D:\somepath
    

    干杯!

    【讨论】:

    • 我已经添加了 acme 子包所在的不同位置的路径: --paths=C:\Data\python\dbrepo --paths=C:\Data\python\utilsrepo 但是它只识别 acme 和 acme.db 包,不识别第二个路径中的 acme.utils 包
    • 很奇怪。更改顺序有相同的结果吗?不是把它放到 Analysis 对象上,而是放到另一个收集器上?有这个 TOC 类吗?
    • 另一个收藏家?你能详细说明一下吗? TOC类?我看到 hookutils 中的 get_pacakge_paths 方法只给出了包的第一个路径,而不是全部,所以 collect_submodules() 只会给出包的第一个路径的子模块。
    • 那么实际上pyinstaller有bug吗? .. 我的意思是:也许你可以不用把它放到“分析”对象中,而是用“EXE”收集器添加你打算在你的包中拥有的库(如果你要选择一个文件选项)。我只是以这种方式添加图像文件,也许你可以对脚本文件做同样的事情pythonhosted.org/PyInstaller/#toc-class-table-of-contents
    • 命名空间包在 Pyinstaller 2.1 中不受支持,它计划在 3.0 版中使用。 groups.google.com/forum/#!topic/pyinstaller/FcZa03oPzhYgithub.com/pyinstaller/pyinstaller/issues/502
    【解决方案2】:

    命名空间包在 Pyinstaller 2.1 中不受支持,后续版本将支持。

    我使用的解决方案是,在我的构建脚本中,我将库临时复制到一个公共 acme 文件夹,然后将此路径添加到 Analysis 中的 pathex。在 *nix 系统上,可以创建符号链接而不是复制存储库。感谢 Pyinstaller 团队的 Hartmut Goebel 澄清了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 2018-12-06
      • 2015-02-17
      • 2013-03-25
      • 1970-01-01
      相关资源
      最近更新 更多