python virtualenv中的sudo权限

新手上路,请多包涵

环境

  • Windows Subsystem for Linux 与 GPS 的串行通信。

  • Adafruit GPS 连接到 Arduino Nano,Arduino Nano 连接到 COM10 。在 Windows Subsystem for Linux 这相当于 /dev/ttyS10

  • 要求: pyserial

我写了一个简单的脚本来从 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()

In the virtualenv I chose Python3 and when I executed it I got Permission Error for the serial port /ttyS10 so I chose to sudo chmod 666 /dev/ttyS10 to use virtualenv 中的脚本。

但是,是否有上述 chmod /dev/serial 的替代方案以避免 PermissionErrors

我知道,即使在 virtualenv 当一个人使用 sudo 时,也不会考虑安装在 virtualenv 中的包,而是 sudo 寻找你的全局 pip packages

原文由 Shan-Desai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 476
1 个回答

当您激活 virtualenv(通过 source venv/bin/activate 或类似方式)时,这基本上只是告诉您的 shell:“嘿,当您搜索命令时,请先查看 venv/bin ,然后再查看其他任何地方” ,通过更新 $PATH 环境变量。 That way, when you run a command like python , your shell sees and runs the python in venv/bin instead of in /usr/bin or wherever .该 Python 副本配置为在 venv/lib 中查找包而不是 /usr/lib ,因此您可以使用 virtualenv 中的包而不是全局安装的包。

但是,当您使用 sudo 运行程序时,它会 忽略 $PATH 。为什么要这样做?因为在 *nix 的历史时期,设置 sudo 是很常见的,这样用户只能用它执行特定的命令,比如(比如) sudo iftop 1 ,这样任何人都可以检查网络是什么被用于,但仍然没有人可以运行 sudo rm -rf /* 。 If sudo respected the user’s $PATH , you could just copy /bin/rm to ~/bin/iftop , add ~/bin to your $PATH ,然后运行 sudo iftop – 但实际上您将以 root 身份运行 rm

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

1 :我实际上不知道有任何命令可以这样设置,这是一个不好的例子,抱歉。

原文由 ash 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题