【问题标题】:Why is the PYTHONPATH different when running Python with and without sudo?为什么在使用和不使用 sudo 的情况下运行 Python 时 PYTHONPATH 会有所不同?
【发布时间】:2015-02-12 12:50:04
【问题描述】:

我的 OSX 系统和 python 出了点问题,没有多少谷歌搜索可以解决。除了我不应该卸载的 OSX 系统 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

【问题讨论】:

    标签: python pip environment-variables sudo


    【解决方案1】:

    比较which pipsudo which pip 的输出会得到什么? 在我的系统上,我得到不同的输出。如果你这样做,我不知道如何解决这个问题,但你可以尝试强制 sudo'd python 在正确的目录中查找:

    import sys
    sys.path.insert(0, '/lib/python2.7/site-packages/')
    
    import pip
    

    【讨论】:

    • 它们都指向/bin/pip。您的解决方案有效。谢谢!但是,我仍然不确定我描述的行为是否有问题。
    【解决方案2】:

    sudo 覆盖您的export。它是同一个 Python(您可以从它打印的版本信息中轻松看出),但它以不同的(系统默认)PYTHONPATH 运行。

    这是sudo的工作之一;它将环境清理为安全的默认值。您也许可以对此进行调整,但真正的问题是,您要完成什么?如果您需要在特定环境中以 root 身份运行,请设置 virtualenv 和/或编写一个包装脚本,以便在调度 Python 之前进行设置。

    【讨论】:

    • 以下无法将 PYTHONPATH 作为我的 sys.path 的一部分打印出来:sudo -E bash -c 'python -c "import sys; print sys.path"'
    • 但是,我可以看到 sudo -E 拾取 PYTHONPATH 如下: sudo -E bash -c "echo $PYTHONPATH" /lib/python2.7/site-packages/
    • 抱歉做了 3 个 cmets,但我认为这样最干净。基本上,我不明白为什么如果 PYTHONPATH 被 sudo -E 选中,为什么 python 不会自动将 PYTHONPATH 包含在 sys.path 列表中?
    • 您使用双引号会暴露当前 shell 的值,而不是 sudo shell 的值。您当前的 shell 将在 sudo 运行之前将所有变量插入双引号中。使用单引号查看根 shell 实例中变量的实际值。
    猜你喜欢
    • 2016-02-28
    • 2018-06-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多