2012-07-19 65 views
0

我有一个python模块打包distutils成一个压缩的鸡蛋安装在自定义前缀。如果我将PYTHONPATH设置为包含该前缀的site-packages目录,则egg会添加到sys.path中,并且可以导入该模块。但是,如果我在脚本中运行site.addsitedir并使用前缀的site-packages目录,则egg不会添加到sys.path,并且导入模块失败。在这两种情况下,模块的site-packages目录都以sys.path结尾。site.addsitedir不添加鸡蛋到sys.path

这是预期的行为?如果是这样,有什么办法可以告诉Python在没有设置env var的情况下处理给定目录中的.pth文件吗?

+0

什么是.pth文件?如果您手动将egg添加到sys.path,它会工作吗?创建和使用鸡蛋的Python版本是否相同? – jfs 2012-07-19 14:43:37

+0

.pth文件:import sys; sys .__ plen = len(sys.path) ./webcharon-0.1-py2.7.egg import sys;新= sys.path中[SYS .__ PLEN:]; del sys.path [sys .__ plen:]; P = GETATTR(SYS, '__ egginsert',0); sys.path中[P:P] =新; sys .__ egginsert = p + len(新) – 2012-07-19 14:56:38

+0

Python版本相同。事实上,相同的二进制。 – 2012-07-19 14:56:58

回答

2

如果我将PYTHONPATH设置为包含该前缀的site-packages目录,则将egg添加到sys.path中,并且可以导入该模块。

将一些目录添加到PYTHONPATH不会触发处理其中的文件.pth。因此你的压缩蛋不会在sys.path。只有当蛋本身位于sys.path(父目录不够)时,才能从蛋中导入模块。

但是,如果我在脚本内部运行site.addsitedir和前缀的site-packages目录,但是egg不会添加到sys.path,并且导入模块失败。

site.addsitedir()触发处理.pth -files如果目录还没有被看到,所以它应该工作。

您描述的行为与应该发生的情况相反。

正如你可以在鸡蛋手动添加到sys.path解决方法:sys.path.insert(0, '/path/to/the.egg')

+0

解决方法奏效。不知道发生了什么,无法在另一台机器上重现。 – 2012-07-20 23:43:29