首页 > 解决方案 > python virtualenv中的sudo权限

问题描述

环境

我编写了一个简单的脚本来从 GPS 模块读取信息:

import serial

def select_sentence():
""" This function sends serial data to the GPS module to display only GPGGA and GPRMC"""

def read_gps():
    ser = serial.Serial("/dev/ttyS10", 9600)
    while True:
         print(ser.readline().decode('utf-8'))

if __name__ == "__main__":
     select_sentence()
     read_gps()

在我选择的 virtualenv 中Python3,当我执行它时,我得到Permission Error了串行端口/ttyS10,所以我选择sudo chmod 666 /dev/ttyS10使用virtualenv.

chmod /dev/serial但是,为了避免上述情况,是否有替代方法PermissionErrors

我知道,即使在virtualenv使用sudo安装在 virtualenv 中的软件包时,也不会考虑,而是 sudo 会查找您的全局pip软件包。

标签: pythonpython-3.xvirtualenv

解决方案


当您激活 virtualenv(通过source venv/bin/activate或类似的)时,它基本上只是告诉您的 shell:“嘿,当您搜索命令时,请先查看,venv/bin然后再查看其他任何地方”,通过更新$PATH环境变量。这样,当您运行类似的命令时python,您的 shell 会看到并运行pythoninvenv/bin而不是 in/usr/bin或任何地方。该 Python 副本被配置为查找venv/lib包而不是/usr/lib.,因此您可以使用 virtualenv 中的包而不是全局安装的包。

但是,当您使用 运行程序时sudo,它会忽略 $PATH. 为什么这样做?因为在 *nix 的历史时期,设置 sudo 是很常见的,这样用户只能使用它执行特定的命令,比如(比如)sudo iftop1,这样任何人都可以检查网络的用途,但仍然没有人可以运行sudo rm -rf /*。如果 sudo 尊重用户的$PATH,您可以复制/bin/rm~/bin/iftop,添加~/bin到您的$PATH,然后运行sudo iftop​​- 但您实际上会rm以 root 身份运行!

因此, sudo$PATH默认忽略。但是您仍然可以通过为 sudo 提供程序的完整路径来执行特定程序,因此您可以通过运行类似sudo ./venv/bin/python(假设您的 virtualenv 被调用venv)以 root 身份在您的 virtualenv 中执行 Python。这将使您成为 root,同时仍然可以访问 virtualenv 中的包,例如 pyserial。

1:我实际上不知道有什么命令会像这样设置,这是一个不好的例子,对不起。


推荐阅读