【发布时间】:2011-11-27 06:27:44
【问题描述】:
为什么 setuptools/easy_install .pth 文件不能很好地与 PYTHONPATH 一起放置,我如何让它们很好地发挥作用,并在 sys.path 中的那些 .pth 推动之前将目录保留在我的 PYTHONPATH 中?
我目前的问题是我为我们的项目创建了一个包,同时要求 PyYAML 和 PyCrypto。
install_requires=["PyYAML",
"pycrypto >= 2.3"]
随着我们的开发,我们已经使用 pip 在标准目录 (/usr/lib64/python2.6/site-packages) 中安装了 PyYaml。我们在那里安装了旧版本的 PyCrypto,然后发现我们需要更新的版本,我们安装在 /opt/devtools/lib64/python2.6/site-packages 下。在 /usr/lib64 之前,我们已经将 PYTHONPATH 设置为首先从 /opt 读取。这一切都在开发中运行良好。运行时,我们从 /opt 获得 PyCrypto 2.3,从 /usr/lib64/...获得 PyYaml。
但是现在,当我尝试在 virtualenv 中安装并运行 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 版本错误。
两个问题:
为什么 setuptools 与添加到 .pth 文件的目录不一致?我希望两个目录都安装,或者两个目录都不安装。
有没有办法让 setuptools 不尝试覆盖我的 PYTHONPATH?为什么这甚至被认为是一个好主意?
【问题讨论】:
-
我认为这在生产中都不会成为问题,那里既没有 PYTHONPATH 也没有 virtualenvs,但它仍然很烦人。
-
我不清楚我们是使用 setuptools 还是分发。我们正在运行 RHEL6,虽然 rpm 是 python-setuptools,但我很确定它实际上是分发的。
-
安装 virtualenv 时是否使用了
--no-site-packages选项,是否在运行python setup.py develop之前激活了 virtualenv? -
第一部分不同意,第二部分同意。我先试试。
-
我知道这没有帮助,但是 pip 比 easy_install 好得多
标签: python setuptools pythonpath