问题描述
我试图在不在/home下的目录中将python环境与系统(使用virtualenv)分开,因为我需要使用它来构建必须可供多个用户访问的其他软件。我可以创建并激活virtualenv,但是当我在sudo
中执行某些命令(例如制作或编译其他软件)时,它是使用的系统python(我可以告诉因为可用的模块)。
因为在Ubuntu上使用root用户并不是一件好事,有没有办法告诉sudo
使用virtualenv?或许这可能不是正确的方法,我应该做一个全新的python安装?
我使用的是64位版本的Ubuntu 12.04(和python 2.7)。
最佳解决方法
问题几乎可以肯定,当您运行sudo
时,virtualenv环境变量,别名,函数等不会被转移。
解决方案是使用sudo
显式运行虚拟环境的Python可执行文件。例如,如果你的virtualenv是./AwesomeProject,那么你可以运行sudo ./AwesomeProject/bin/python <script>
来使用带有root权限的virtualenv的脚本。
次佳解决方法
只是偶然发现了这一点,对于可能发现同样问题的其他人来说,Ken是正确的,因为env变量没有被转移。我使用的解决方案是将以下行添加到我的脚本中。这具有始终直接从脚本加载虚拟环境的额外好处。 (这意味着您可以在没有任何其他解决方法的情况下将脚本与crontab或launchd一起使用。)
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
第三种解决方法
有时您需要更新$ PATH,因为脚本运行其他程序。例如,pypi-install在PATH中需要py2dsc-deb。此命令有效:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"