根据doc我可以直接使用我的私人pypi存储库而不是官方存储库:
For pip this can be done by setting the environment variable PIP_INDEX_URL in your .bashrc/.profile/.zshrc:
export PIP_INDEX_URL=http://localhost:8080/simple/
所以我将我的私有存储库(例如,http://pypi.mycompany.com/simple
)添加到我的Debian服务器上的/etc/profile
。然而,pip仍会引发错误:
john@server:~$ sudo pip install ipython
Downloading ...
Cannot fetch index base URL https://pypi.python.org/simple/
...
看起来像pip忽略了我设置的环境变量PIP_INDEX_URL
。为什么呢?
更新
按照@ Ivo的指示,我发现我的Python根本没有看到变量:
john@server:~$ sudo python -c "import os; print(os.getenv('PIP_INDEX_URL'))"
None
答案 0 :(得分:4)
找到它。很简单:出于安全原因,默认情况下sudo
不会使用环境变量。要告诉sudo
保留env变量,可以使用-E
选项,例如
sudo -E pip install ipython
答案 1 :(得分:0)
Sudo 通过重置大多数环境变量来净化安全环境。默认情况下,它会重置其保留列表中的变量之外的所有变量。 Sudo 有三类环境变量:check、reset、preserve。默认情况下,它会重置保留列表中列出的变量之外的所有变量。
可用选项:
如前所述,您可以使用 -E
也拼写为 --preserve-env
全局传递所有环境变量。
这代表一个安全问题。传递环境变量可能会污染或以其他方式影响(安全)环境中的执行。考虑 $LD_PRELOAD
或 $IFS
的问题。
-E
和 --preserve-env
支持要保留的变量参数列表,以及默认变量:
sudo --preserve-env=PIP_INDEX_URL pip install python
您可以通过 shell 将 env 变量显式传递给 ssh 命令:
sudo -e PIP_INDEX_URL=${PIP_INDEX_URL} pip install ipython
${PIP_INDEX_URL} 在传递给 sudo
之前被 shell 展开。
这是一个方便的 shell 技巧,适用于 ssh
和任何其他将参数和环境直接传递给子进程的东西。
修改 sudoers
中的 sudo 配置以扩展允许传递给子级的环境变量列表。请参阅 env_keep
选项。
DEFAULT env_keep+=PIP_INDEX_URL
我认为这个选项是最干净的,尤其是在具有多个用户且预期使用相同 pip 选项的系统上。
您的 sudoers
文件的最后一行可能包含一个 #includedir
指令。如果是这样,请将您的修改放在该目录中的文件中。例如/etc/sudoers.d/pip_environment
并为 PIP_INDEX_URL
、PIP_TRUSTED_HOST
、PIP_EXTRA_INDEX_URL
和配置中所需的任何其他选项添加保留选项。
参考:
sudoers 配置:man 5 sudoers
sudo 选项:man 8 sudo
pip 环境变量以 PIP_
格式命名,后跟完整命令行标志的大写拼写。请参阅:pip config file documentation
您可以在以 root 身份运行 sudo -V
的输出中查看检查、重置和保留列表:
% sudo sudo -V
# ...
Environment variables to check for sanity:
TZ
TERM
# ...
Environment variables to remove:
*=()*
# ...
Environment variables to preserve:
MAIL
HOME