【问题标题】:How can I make a Python extension module packaged as an egg loadable without installing it?如何在不安装的情况下将 Python 扩展模块打包为可加载的鸡蛋?
【发布时间】:2010-10-18 18:04:21
【问题描述】:

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

无论如何,我遇到了以下情况,但我找不到解决办法:

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

这听起来很简单:您计算出PYTHONPATH 应该是什么,构造sys.environ 的副本,正确设置变量,然后使用subprocess.Popen 调用PyInstaller 脚本,将先前配置的环境作为env 参数传递。

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

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

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

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

完成此操作后,鸡蛋会正常加载。同样,这不切实际,因为我需要能够以准备好从关闭导入这些鸡蛋的方式运行我的 python shell。

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

【问题讨论】:

    标签: python setuptools egg waf build-tools


    【解决方案1】:

    嘿,我认为这是我的错。问题似乎是 setup.py 中扩展包的 zipsafe 标志设置为 False,这似乎完全影响了您对其进行处理的能力。

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

    我希望有一天其他人会发现这个答案有用!

    【讨论】:

      【解决方案2】:

      尽管您有解决方案,但您始终可以尝试“virtualenv”,它创建一个 python 虚拟环境,您可以在其中安装和测试 Python 包,而不会弄乱核心系统 python:

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

      【讨论】:

      • 这是一个很好的答案,我确实在一些地方使用了 VirtualEnv,但在这里我不想设置一个完整的虚拟环境来调用那个脚本。也就是说,它可能会帮助其他有类似问题的人。
      猜你喜欢
      • 2010-11-14
      • 2011-04-10
      • 2011-02-17
      • 2017-03-08
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      相关资源
      最近更新 更多