python virtualen中的sudo特权

2024-10-01 09:39:03 发布

您现在位置:Python中文网/ 问答频道 /正文

环境

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

  • Adafruit GPS连接到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()

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

然而,有没有替代上述chmod /dev/serial的方法来避免{}?在

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


Tags: todev脚本forvirtualenvlinuxwindowsdef
2条回答

还要确保您已经创建了不带sudo命令的virtualenv,因为这可能会导致以后使用不带sudo的virtualenv的权限问题。如果是这种情况,请运行以下命令:

sudo chown -R your_username:your_username path/to/virtuaelenv/

然后,您可以为您的用户启用读取/dev/ttyS10的权限,并由该用户运行python脚本。在

注意:您还需要将shebang line to添加到python脚本的顶部,并在env中提供python解释器的路径。这样你就可以不用翻译了。在

#!/path/to/venv/bin python3

查看更多信息请回答:Should I put #! (shebang) in Python scripts, and what form should it take?

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

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

因此,sudo默认忽略$PATH。但是您仍然可以通过给sudo提供程序的完整路径来执行特定的程序,因此您可以在virtualenv中通过运行类似sudo ./venv/bin/python(假设您的virtualenv名为venv)的根来执行Python。这将使您在仍然可以访问virtualenv中的包(如pyserial)的情况下根目录。在

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

相关问题 更多 >