在PYTHONPATH环境变量之前的路径中的鸡蛋

jte*_*ace 16 python setuptools easy-install

如果我从easy_install安装了软件包,则会sys.pathPYTHONPATH变量中的项之前添加egg .

例如,如果我在当前目录中安装了一个名为foo的egg包以及一个名为foo的包,那么执行以下操作:

PYTHONPATH="." python
>>> import foo
Run Code Online (Sandbox Code Playgroud)

这将使用egg版本foo而不是本地目录.检查sys.path显示鸡蛋放在物品之前PYTHONPATH.这似乎破了.有没有办法覆盖这种行为?

sam*_*ias 13

不幸的是,这是通过内部的硬编码模板完成的setuptools/command/easy_install.py.您可以使用已编辑的模板创建修补的setuptools,但我发现没有干净的方法可以从外部扩展easy_install.

每次easy_install运行时,它都会重新生成文件easy_install.pth.这是一个快速脚本,您可以在easy_install之后运行,以从中删除页眉和页脚easy_install.pth.您可以创建一个包装器shell脚本,以便在以下情况后立即运行easy_install:

#!/usr/bin/env python
import sys
path = sys.argv[1]
lines = open(path, 'rb').readlines()
if lines and 'import sys' in lines[0]:
    open(path, 'wb').write(''.join(lines[1:-1]) + '\n')
Run Code Online (Sandbox Code Playgroud)

例:

% easy_install gdata
% PYTHONPATH=xyz python -c 'import sys; print sys.path[:2]'
['', '/Users/pat/virt/lib/python2.6/site-packages/gdata-2.0.14-py2.6.egg']

% ./fix_path ~/virt/lib/python2.6/site-packages/easy_install.pth
% PYTHONPATH=xyz python -c 'import sys; print sys.path[:2]'
['', '/Users/pat/xyz']
Run Code Online (Sandbox Code Playgroud)

有关更多说明,请参阅以下格式easy-install.pth:

import sys; sys.__plen = len(sys.path)
./gdata-2.0.14-py2.6.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Run Code Online (Sandbox Code Playgroud)

这两条import sys线是导致鸡蛋出现在路径起点的罪魁祸首.我的脚本只删除了那些sys.path-munging行.

  • 当路径/鸡蛋被添加到`sys.path`时,用户站点没有优先权是非常恼人的.在我没有sudo的机器上,我没有找到任何方法来覆盖系统范围内安装的用户安装的软件包.这似乎是`sys.path`汇编方式中一个非常严重的缺陷. (5认同)