如何在虚拟环境中将 sudo 与 python 一起使用

Skr*_*asa 1 python sudo virtualenv virtual-environment

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

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

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

我该如何解决这个问题?

Cri*_*ati 6

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

总而言之:

sudo -E env PATH=${PATH} python somescript.py
Run Code Online (Sandbox Code Playgroud)

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

(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
Run Code Online (Sandbox Code Playgroud)

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

sudo -E env PATH=${PATH} /somePath/someFolder/myEnvironment/bin/python somescript.py
Run Code Online (Sandbox Code Playgroud)