我正在修改我们的构建脚本以基于出色的 Waf 工具(我确实使用 SCons 很长时间了,但它太慢了) 。
无论如何,我遇到了以下情况,我找不到解决办法:
- 我有一个依赖于许多先前构建的 egg 文件的产品。
- 我正在尝试使用PyInstaller打包产品作为构建过程的一部分。
- 我首先构建依赖项。
- 接下来我要运行 PyInstaller 来打包依赖于我构建的鸡蛋的产品。我需要 PyInstaller 能够在打包过程中加载这些 egg 文件。
这听起来很简单:您计算出PYTHONPATH
应该是什么,构建sys.environ
正确设置变量的副本,然后使用subprocess.Popen
传递先前配置的环境作为 env 参数来调用 PyInstaller 脚本。
问题是,PYTHONPATH
如果您添加的鸡蛋是打包为 zipsafe 的扩展模块,那么单独设置似乎是不够的。在这种情况下,事实证明嵌入式库无法导入。
如果我解压缩鸡蛋(将目录重命名为 .egg),我可以在没有进一步设置的情况下导入它们,但在这种情况下这不是我想要的。
我还可以通过执行以下操作从子外壳中导入鸡蛋:
- 设置
PYTHONPATH
为包含您要导入的鸡蛋的目录(不是鸡蛋本身的路径) - 加载一个 python shell 并使用
pkg_resources.require
它来定位鸡蛋。
完成此操作后,鸡蛋将正常加载。同样,这不切实际,因为我需要能够以准备好从关闭导入这些鸡蛋的方式运行我的 python shell。
肮脏的选择是在调用真正的目标脚本之前输出一个执行上述操作的包装脚本,但这似乎是错误的做法:必须有更好的方法来做到这一点。