当前位置: 首页>>技术问答>>正文


如何使用python virtualenv与sudo?

, ,

问题描述

我试图在不在/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"

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2242.html,未经允许,请勿转载。