带有命名空间包的 pyinstaller

pyinstaller with namespace packages

我有一个 module/package 结构,我在其中使用命名空间包,我有多个用户创建的库,我将它们保存在单独的存储库中,并且它们具有相当通用的名称,如 db、io、utils 等。为了避免与其他包冲突,我有一个名为 acme 的顶级 level/namespace 包,即我的包是 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 变量中首先列出的包。

关于如何完成这项工作的任何提示?

谢谢

我刚遇到同样的问题。查了一下: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

干杯!

Pyinstaller 2.1不支持命名空间包,后续版本会支持。

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