让setuptools/easy_install与PYTHONPATH和谐共处

8 投票
1 回答
1831 浏览
提问于 2025-04-17 03:18

为什么setuptools/easy_install的.pth文件和PYTHONPATH不太兼容?我该如何让它们更好地配合,并在.pth文件插入sys.path之前,保持我的PYTHONPATH中的目录?

我现在的问题是,我为我们的项目创建了一个包,里面需要用到PyYAML和PyCrypto这两个库。

  install_requires=["PyYAML",
                    "pycrypto >= 2.3"]

在开发过程中,我们用pip把PyYAML安装到了标准目录(/usr/lib64/python2.6/site-packages)。然后我们在这里安装了一个旧版本的PyCrypto,后来发现需要更新的版本,于是我们把新版本安装到了/opt/devtools/lib64/python2.6/site-packages。我们已经把PYTHONPATH设置为先读取/opt,再读取/usr/lib64。这在开发时一切正常。当我们运行时,PyCrypto 2.3是从/opt读取的,而PyYAML则是从/usr/lib64/...读取的。

但是现在,当我尝试在虚拟环境中安装,并运行python setup.py develop时,setuptools/distribute最终把/usr/lib64/python2.6/site-packages添加到了easy-install.pth中,但没有添加/opt/devtools/lib64/python2.6/site-packages。它找到了正确的版本,输出如下:

Using /home/s3447/projects/wsrs.git/emp_parsing
Searching for pycrypto==2.3
Best match: pycrypto 2.3
Adding pycrypto 2.3 to easy-install.pth file

Using /opt/wsrs-devtools/stow/pycrypto-2.3/lib64/python2.6/site-packages
Searching for PyYAML==3.10
Best match: PyYAML 3.10
Adding PyYAML 3.10 to easy-install.pth file

但没有把/opt/...添加到easy-install.pth中。(只有/usr/lib64...和我运行setup.py的目录被添加到路径中。)

最终结果是,虽然setuptools认为它成功了,但当我运行我的代码时,easy-install.pth却认为它比我更了解我的需求,插入到我的PYTHONPATH之前,导致我最终导入了错误版本的PyCrypto。

有两个问题:

  1. 为什么setuptools在添加目录到.pth文件时不一致?我本来期待要么两个目录都添加,要么都不添加。

  2. 有没有办法让setuptools不去覆盖我的PYTHONPATH?为什么一开始会认为这样做是个好主意呢?

1 个回答

0

根据我对你问题的理解,这里可能是你可以提出你担忧的地方: https://github.com/pypa/setuptools/issues/397

听起来其他人也遇到过类似的问题。我可能理解错了,我只是用pip。尽量不使用easy_install。

撰写回答