环境
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 许可协议
当您激活 virtualenv(通过
source venv/bin/activate
或类似方式)时,这基本上只是告诉您的 shell:“嘿,当您搜索命令时,请先查看venv/bin
,然后再查看其他任何地方” ,通过更新$PATH
环境变量。 That way, when you run a command likepython
, your shell sees and runs thepython
invenv/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 :我实际上不知道有任何命令可以这样设置,这是一个不好的例子,抱歉。