为什么使用sudo和不使用sudo运行Python时PYTHONPATH不同?

4

我的OSX系统和Python出了问题,无论我怎么搜索都没能解决。我已经卸载了除了系统自带的Python包之外的所有Python文件,并从python.org开始重新安装Python,并安装了pip。

现在......不确定下面的行为是否是问题的一部分,但它对我来说似乎很奇怪:

我运行了两次Python。一次使用sudo,一次没有。没有使用sudo时,我无法访问pip。发生了什么?

$ sudo /Library/Frameworks/Python.framework/Versions/2.7/bin/python
Python 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pip

然而...
$ /Library/Frameworks/Python.framework/Versions/2.7/bin/python
Python 2.7.9 (v2.7.9:648dcafa7e5f, Dec 10 2014, 10:10:46)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
>>>

我已经参考了:sudo python runs old python version

我的.bash_profile没有任何内容,其他配置文件也是一样。

我所做的就是以下几步:

export PYTHONPATH=/lib/python2.7/site-packages/

ls $PYTHONPATH 返回:

_markerlib          pip             pkg_resources.pyc       setuptools-8.0.1.dist-info  virtualenv.pyc
easy_install.py         pip-1.5.6.dist-info     setuptools          virtualenv-1.11.6.dist-info virtualenv_support
easy_install.pyc        pkg_resources.py        setuptools-7.0.dist-info    virtualenv.py

which pip 返回:

/bin/pip
2个回答

2
sudo 命令会覆盖 export 命令。虽然使用的是相同的 Python 版本(可以通过打印版本信息轻松确认),但是它会使用不同的(系统默认的)PYTHONPATH
这是 sudo 的职责之一,它会将环境设置为安全的默认值。您可能能够进行微调,但真正的问题是,您想要实现什么目标?如果您需要以特定环境作为 root 运行,请设置一个 virtualenv 和/或编写一个包装脚本,在分派 Python 之前设置好环境。

以下代码无法打印出PYTHONPATH作为我的sys.path的一部分:sudo -E bash -c 'python -c "import sys; print sys.path"' - imagineerThat
然而,我可以看到sudo -E会按照以下方式获取PYTHONPATH:sudo -E bash -c "echo $ PYTHONPATH" /lib/python2.7/site-packages/ - imagineerThat
1
抱歉留了三个评论,但我认为这样最清晰。基本上,我不明白为什么如果sudo -E捕获PYTHONPATH,为什么python不会自动将PYTHONPATH包含在sys.path列表中? - imagineerThat
1
你使用双引号会暴露当前 shell 的值,而不是 sudo shell 的值。在 sudo 运行之前,你的当前 shell 会插入任何双引号中的变量。使用单引号可以查看根 shell 实例中变量的实际值。 - tripleee

1
当您比较which pipsudo which pip的输出时,会得到什么?在我的系统上,输出是不同的。如果您也有这种情况,我不确定如何解决,但您可以尝试强制sudo'd Python查找正确的目录:
import sys
sys.path.insert(0, '/lib/python2.7/site-packages/')

import pip

它们都指向 /bin/pip。你的解决方案有效。谢谢!不过,我仍然不确定我描述的行为是否有问题。 - imagineerThat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接