我试图在一个不在 /home 下的目录中将 python 环境与系统一(使用 virtualenv)分开,因为我需要使用它来构建其他软件,这些软件必须可供多个用户访问。我可以创建并激活virtualenv,但是当我执行sudo某些命令(例如制作或编译其他软件)时,使用的是系统python(由于可用模块,我可以分辨出来)。
由于在 Ubuntu 上使用root用户不是一件好事,有没有办法告诉sudo使用 virtualenv?或者这可能不是正确的方法,我应该进行全新的 python 安装?
我使用的是 64 位版本的 Ubuntu 12.04(和 python 2.7)。
Ken*_*der 79
问题几乎可以肯定,当您运行时sudo,virtualenv 环境变量、别名、函数等没有被保留。
解决方案是使用sudo. 例如,如果您的 virtualenv 是 ./AwesomeProject,那么您可以sudo ./AwesomeProject/bin/python <script>使用具有 root 权限的 virtualenv运行该脚本。
wvx*_*xvw 14
根据您的特定用例,这可能会也可能不会解决您的问题,但这里尚未提及。假设您想要运行安装在虚拟环境中的 Python 脚本,并且您需要setuid(0)它,即您想要以超级用户身份运行它。假设您的脚本名为myscript.py,那么您可以这样做:
(.venv) $ sudo -E env PATH=$PATH ./myscript.py
Run Code Online (Sandbox Code Playgroud)
(.venv) $是shell的提示符,你不需要键入它,它只是表明你当前正在使用某个虚拟环境,并且你不是特权用户。
sudo -E会告诉你sudo,当启动一个进程时,它需要从当前的 shell 环境中复制环境变量。因此,如果您在脚本中定义了任何额外的变量.venv/bin/activate,它们应该在您执行操作时保留下来root。
env PATH=$PATH当使用时,sudo -E并非所有环境变量都被保留,特别是,最重要的是,PATH可能会被删除。此行为的具体情况取决于您的 sudoers 文件。然而,这将绕过 sudoers 文件中写入的任何内容,因为它将显式地将其复制到为新进程创建的PATH环境中。sudo这很重要,因为当您的系统解析 中的 shebang 注释时myscript.py,它将查找PATH变量,并且将使用符合解释器要求的第一个目录。venv另一方面,以这样的方式设置 shell 环境,即包含所选 Python 解释器符号链接的目录首先出现,从而使系统在系统路径上的任何其他 Python 之前找到所需的 Python。
| 归档时间: |
|
| 查看次数: |
61346 次 |
| 最近记录: |