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
包。在
还要确保您已经创建了不带sudo命令的virtualenv,因为这可能会导致以后使用不带sudo的virtualenv的权限问题。如果是这种情况,请运行以下命令:
sudo chown -R your_username:your_username path/to/virtuaelenv/
然后,您可以为您的用户启用读取
/dev/ttyS10
的权限,并由该用户运行python脚本。在注意:您还需要将shebang line to添加到python脚本的顶部,并在env中提供python解释器的路径。这样你就可以不用翻译了。在
查看更多信息请回答: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 iftop
1,这样任何人都可以检查网络的用途,但是仍然没有人可以运行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:我实际上不知道有什么命令会这样设置,这是一个很糟糕的例子,对不起。在
相关问题 更多 >
编程相关推荐