如何让打包为egg的Python扩展模块在不安装的情况下加载?

0 投票
2 回答
1371 浏览
提问于 2025-04-15 11:06

我正在重新整理我们的构建脚本,打算使用非常棒的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。

http://pypi.python.org/pypi/virtualenv

3

嘿,我觉得这是我的错。问题似乎出在扩展包的setup.py文件中的zipsafe标志被设置为False,这会影响你是否能把它当作一个正常的包来使用。

现在我把这个标志改成True后,就可以通过把每个文件添加到PYTHONPATH中来导入这些egg文件了。

希望将来有人能觉得这个答案有用!

撰写回答