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

时间:2009-04-10 11:37:53

标签: python setuptools egg waf build-tools

我正在重新构建基于the wonderful Waf tool的构建脚本(我确实使用了SCons很长时间,但它只是方式太慢)。

无论如何,我遇到了以下情况,我无法找到解决方案:

  • 我的产品取决于许多以前制作的鸡蛋文件。
  • 我正在尝试使用PyInstaller打包产品,作为构建过程的一部分。
  • 我首先构建依赖项。
  • 接下来我想运行PyInstaller来打包依赖于我建立的蛋的产品。我需要PyInstaller才能将这些egg文件作为其打包过程的一部分加载。

这听起来很简单:你弄清楚PYTHONPATH应该是什么,构造sys.environ的副本正确设置变量,然后使用subprocess.Popen调用PyInstaller脚本传递先前配置的环境作为env论证。

问题是,如果要添加的鸡蛋是打包为zipsafe的扩展模块,单独设置PYTHONPATH似乎不够。在这种情况下,事实证明无法导入嵌入式库。

如果我解压缩鸡蛋(将目录重命名为.egg),我可以在没有进一步设置的情况下导入它们,但在这种情况下这不是我想要的。

我还可以通过执行以下操作从子shell中导入鸡蛋:

  • PYTHONPATH设置为包含要导入的蛋的目录(不是蛋本身的路径)
  • 加载python shell并使用pkg_resources.require找到鸡蛋。

一旦完成,鸡蛋就会正常加载。同样,这是不实际的,因为我需要能够以一种准备从关闭导入这些蛋的方式运行我的python shell。

脏选项是输出一个包装脚本,在调用真正的目标脚本之前采取了上述操作,但这似乎是错误的做法:必须有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:3)

嘿,我觉得这是我的坏事。问题似乎是扩展程序包的setup.py中的zipsafe标志设置为False,这似乎会影响您根本无法对其进行处理。

现在我已将其设置为True我可以导入egg文件,只需将每个文件添加到PYTHONPATH即可。

我希望其他人有一天能找到这个答案!

答案 1 :(得分:1)

虽然你有一个解决方案,你总是可以尝试“virtualenv”创建一个python的虚拟环境,你可以在这里安装和测试Python包而不会搞乱核心系统python:

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