【问题标题】:site.addsitedir doesn't add egg to sys.pathsite.addsitedir 不会将鸡蛋添加到 sys.path
【发布时间】:2012-07-19 14:11:03
【问题描述】:

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

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

【问题讨论】:

  • .pth 文件中有什么?如果您手动将鸡蛋添加到 sys.path 中是否有效?创建和使用 egg 的 Python 版本是否相同?
  • .pth 文件:导入系统; sys.__plen = len(sys.path) ./webcharon-0.1-py2.7.egg 导入系统;新=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
  • Python 版本相同。事实上,相同的二进制文件。
  • 糟糕,在 .pth 文件中,'./webcharon...' 之前和 '.egg' 之后有一个换行符

标签: python pythonpath


【解决方案1】:

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

PYTHONPATH 添加一些目录不会触发对其中的.pth 文件的处理。因此,您的压缩鸡蛋不会在sys.path 中。仅当 egg 本身在 sys.path(父目录不够)时,才能从 egg 导入模块。

但是,如果我从脚本中运行带有前缀的站点包目录的 site.addsitedir,则 egg 不会添加到 sys.path 并且模块导入失败。

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

你描述的行为与应该发生的相反。

作为一种解决方法,您可以手动将鸡蛋添加到sys.pathsys.path.insert(0, '/path/to/the.egg')

【讨论】:

  • 解决方法有效。不知道发生了什么,无法在另一台机器上重现。
猜你喜欢
  • 2015-06-25
  • 2017-03-08
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2017-02-28
  • 2013-04-13
相关资源
最近更新 更多