【问题标题】:How do I use sudo with python inside virtualenvironment如何在虚拟环境中使用 sudo 和 python
【发布时间】:2020-05-10 16:52:50
【问题描述】:

您好,我正在尝试从我的虚拟环境中以 sudo 的身份运行 python 脚本。

当我激活我的虚拟环境后,我通常会使用python somescript.py,我的脚本会以正确版本的 python 和所有内容启动

当我使用 sudo python somescript.py 时,我加载了错误的 python 安装,这不是我的环境中的。

我该如何解决这个问题?

【问题讨论】:

  • 您需要在虚拟环境中安装正确版本的 python。您是在环境中使用 Conda 还是在其他方面?
  • 我正在使用 venv 我用这个命令创建了环境 python3 -m venv ‘Name‘
  • 为什么你的 Python 脚本需要 sudo 权限?
  • 很多时候,不需要激活虚拟环境。你试过sudo path/to/venv/bin/python somescript.py之类的吗?

标签: python virtualenv sudo virtual-environment


【解决方案1】:

activate 脚本设置一些环境变量(定义一些函数,...),这有助于调用 Python(和工具)。
实现目标的一种方法(更像是一种解决方法)是在[man7]: sudo(8) 会话中传递变量。为此,您需要:

总而言之:

sudo -E env PATH=${PATH} python somescript.py

输出(适用于简单命令):

(py_venv_pc064_03.05.02_test0) [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q061715573]> python3 -c "import sys, os; print(\"EXE: {0:s}\nPATH: {1:s}\n\".format(sys.executable, os.environ[\"PATH\"]))"
EXE: /home/cfati/Work/Dev/VEnvs/py_venv_pc064_03.05.02_test0/bin/python3
PATH: /home/cfati/Work/Dev/VEnvs/py_venv_pc064_03.05.02_test0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

(py_venv_pc064_03.05.02_test0) [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q061715573]> sudo python3 -c "import sys, os; print(\"EXE: {0:s}\nPATH: {1:s}\n\".format(sys.executable, os.environ[\"PATH\"]))"
EXE: /usr/bin/python3
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

(py_venv_pc064_03.05.02_test0) [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q061715573]> sudo -E env PATH=${PATH} python3 -c "import sys, os; print(\"EXE: {0:s}\nPATH: {1:s}\n\".format(sys.executable, os.environ[\"PATH\"]))"
EXE: /home/cfati/Work/Dev/VEnvs/py_venv_pc064_03.05.02_test0/bin/python3
PATH: /home/cfati/Work/Dev/VEnvs/py_venv_pc064_03.05.02_test0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

在这种情况下永远不会失败的一种方法是使用 (Python 的) 可执行完整路径。但由于这只是一个符号链接,你可能还是想保护环境:

sudo -E env PATH=${PATH} /somePath/someFolder/myEnvironment/bin/python somescript.py

【讨论】:

  • 这仍然从/user/bin/python 加载python,而不是虚拟环境中的那个
  • 当你启动 sudo 时,你可能不在 venv 中。
【解决方案2】:

我认为这里有答案:https://askubuntu.com/questions/234758/how-to-use-a-python-virtualenv-with-sudo

几乎可以肯定的是,当您运行 sudo 时,virtualenv 没有携带环境变量、别名、函数等 结束了。

解决方案是显式运行虚拟环境的 带有 sudo 的 Python 可执行文件。例如,如果您的 virtualenv 是 ./AwesomeProject,然后你可以运行 sudo ./AwesomeProject/bin/python 使用具有 root 权限的 virtualenv 脚本。

【讨论】:

  • 当我尝试这样做时,它似乎没有加载正确的 python。基本上我正在做这整件事来使用 tensorflow,特别是最新的夜间版本。当我用 sudo ./name_of_venv/bin/python 打开 python 并检查安装的版本时,它不是我想要使用的 tensorflow 构建
  • which python 告诉你什么时候运行正确?
  • which python 正在向我显示虚拟环境的路径 /somePath/someFolder/myEnvironment/bin/python 而 sudo which python 正在向我显示 /user/bin/python
  • 所以你应该使用sudo /somePath/someFolder/myEnvironment/bin/python 来正确使用sudo。或者您可能已将 Tensorflow 安装到您想要的其他位置?
  • 当我尝试使用 sudo /somePath/someFolder/myEnvironment/bin/python 加载那个 python 时,我无法执行权限被拒绝
猜你喜欢
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2015-12-21
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多