如何让打包为egg的Python扩展模块在不安装的情况下加载?
我正在重新整理我们的构建脚本,打算使用非常棒的Waf工具(我之前用过SCons,但它实在是太慢了)。
不过,我遇到了一个问题,找不到解决办法:
- 我有一个产品,它依赖于一些之前构建好的egg文件。
- 我想用PyInstaller来打包这个产品,作为构建过程的一部分。
- 我先构建依赖项。
- 接下来,我想运行PyInstaller来打包依赖于我构建的egg文件的产品。我需要PyInstaller在打包过程中能够加载这些egg文件。
这听起来很简单:你只需要弄清楚PYTHONPATH
应该是什么,构建一个sys.environ
的副本,正确设置变量,然后用subprocess.Popen
调用PyInstaller脚本,把之前配置好的环境作为env参数传进去。
问题是,仅仅设置PYTHONPATH
似乎不够,如果你添加的egg是作为zipsafe打包的扩展模块。在这种情况下,嵌入的库无法被导入。
如果我解压这些egg(把目录重命名为.egg),我可以不需要其他设置就能导入它们,但这不是我想要的。
我也可以通过以下方式从子shell中导入这些egg:
- 把
PYTHONPATH
设置为包含你想导入的egg的目录(而不是egg本身的路径) - 加载一个python shell,使用
pkg_resources.require
来定位这个egg。
完成这些后,egg就能正常加载了。不过,这样做不太实际,因为我需要在一开始就能准备好从python shell中导入这些egg。
一个不太优雅的解决办法是输出一个包装脚本,在调用真正的目标脚本之前执行上述操作,但这似乎不是正确的做法:肯定还有更好的方法。
2 个回答
1
虽然你已经有了解决办法,但你可以试试“virtualenv”。它可以创建一个Python的虚拟环境,在这个环境里你可以安装和测试Python包,而不会影响到系统里原本的Python。
3
嘿,我觉得这是我的错。问题似乎出在扩展包的setup.py文件中的zipsafe
标志被设置为False,这会影响你是否能把它当作一个正常的包来使用。
现在我把这个标志改成True后,就可以通过把每个文件添加到PYTHONPATH
中来导入这些egg文件了。
希望将来有人能觉得这个答案有用!