python - python virtualenv中的sudo权限
问题描述
环境
Windows Subsystem for Linux
与 GPS 的串行通信。Adafruit GPS 连接到连接到
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
但是,为了避免上述情况,是否有替代方法PermissionErrors
?
我知道,即使在virtualenv
使用sudo
安装在 virtualenv 中的软件包时,也不会考虑,而是 sudo 会查找您的全局pip
软件包。
解决方案
当您激活 virtualenv(通过source venv/bin/activate
或类似的)时,它基本上只是告诉您的 shell:“嘿,当您搜索命令时,请先查看,venv/bin
然后再查看其他任何地方”,通过更新$PATH
环境变量。这样,当您运行类似的命令时python
,您的 shell 会看到并运行python
invenv/bin
而不是 in/usr/bin
或任何地方。该 Python 副本被配置为查找venv/lib
包而不是/usr/lib
.,因此您可以使用 virtualenv 中的包而不是全局安装的包。
但是,当您使用 运行程序时sudo
,它会忽略 $PATH
. 为什么这样做?因为在 *nix 的历史时期,设置 sudo 是很常见的,这样用户只能使用它执行特定的命令,比如(比如)sudo iftop
1,这样任何人都可以检查网络的用途,但仍然没有人可以运行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:我实际上不知道有什么命令会像这样设置,这是一个不好的例子,对不起。
推荐阅读
- pandas - 有什么方法可以在顺序日历中填写销售记录的缺失行
- windows - 如何区分 Windows HID API 中的设备?
- r - 在调用环境中评估函数
- java - Java 代码在从变量引用时有效,但在直接调用时抛出错误
- firebase - Firebase 云调度程序功能成本
- css - 为什么 mask-image 属性在浏览器中不起作用?
- python - -bash: fork: 无法分配内存 ubuntu 18.04.3
- node.js - 注册时不需要 Schema.Types.ObjectId
- ldap - 使用组的 openvpn LDAP 身份验证
- c# - 停止协程或更改 while 循环条件会冻结游戏