带有命名空间包

时间:2015-05-22 07:16:51

标签: python namespaces package pyinstaller

我有一个模块/包结构,我在使用命名空间包,我有多个用户创建的库,我保存在不同的存储库中,并且它们具有相当通用的名称,如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文件。 / p>

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

有关如何使这项工作的任何提示?

由于

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。查看了这个: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

喝彩!

答案 1 :(得分:0)

Pyinstaller 2.1不支持命名空间包,在以后的版本中将支持它。

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