如何在sudo中使用python virtualenv?


47

我试图在不位于/ home下的目录中使python环境与系统环境分开(使用virtualenv),因为我需要使用它来构建必须可供多个用户访问的其他软件。我可以创建和激活virtualenv,但是当我执行sudo某些命令(例如,制作或编译其他软件)时,将使用系统python(由于可用的模块,我可以确定)。

由于在Ubuntu上使用root用户不是一件好事,有没有办法告诉sudo使用virtualenv?还是这不是正确的方法,我应该进行全新的python安装?

我正在使用64位版本的Ubuntu 12.04(和python 2.7)。


1
请问以下工作吗?sudo $(which python)<脚本>
John Drinane

Answers:


57

问题几乎可以肯定是,当您运行时sudo,virtualenv环境变量,别名,函数等不会被继承。

解决方案是使用显式运行虚拟环境的Python可执行文件sudo。例如,如果您的virtualenv是./AwesomeProject,则可以运行sudo ./AwesomeProject/bin/python <script>具有root特权的virtualenv来使用脚本。


3
您还可以让脚本的第一行指向virtualenv中的Python二进制文件。#!<virtualenv_dir>/bin/python
OrangeTux

gh恼,到目前为止,这只是解决方案。在Mac上,sudo python使用虚拟环境中的python。
盖芬

4

对于偶然发现的问题以及对于可能会发现相同问题的其他问题,Ken正确地认为env变量没有被继承。我使用的解决方案是在脚本中添加以下几行。这具有始终直接从脚本加载虚拟环境的额外好处。(这意味着您可以将脚本与crontab一起使用,也可以在没有其他任何变通方法的情况下启动该脚本。)

base_dir = os.path.dirname(os.path.abspath(__file__))
activate_this = os.path.join(base_dir, 'venv/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

此处提供更多背景信息:https : //virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python


4

有时您需要更新$ PATH,因为该脚本运行其他程序。例如,pypi-install在PATH中需要py2dsc-deb。该命令有效:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.