Python write to Linux device using subprocess gives ValueError : embedded null byte
Python write to Linux device using subprocess gives ValueError : embedded null byte
在 Debian Linux 系统上,我有一个 Python 脚本,用于准备要写出到位于 /dev/ttyACM0 的 USB CDC 设备的字符串。此写入发生在脚本末尾,如下所示...
USBpipe = open("/dev/ttyACM0", 'w')
shellCmd = subprocess.Popen(["echo", USBpacket], stdout = USBpipe)
USBpipe.close()
...其中 USBpacket 是一个字符串。如果我将其设为纯字符串,例如使用 USBpacket = "test"
,代码将正确执行,并且我已验证数据出现在 USB 设备上。但是,在正常执行期间,USBpacket 通过 chr()
函数获取附加到它的字节,其中一些可能为零。发生这种情况时,我收到此错误 运行 脚本:
Traceback (most recent call last):
File "/root/gpstoPIC.py", line 247, in <module>
shellCmd = subprocess.Popen(["echo", USBpacket], stdout = USBpipe)
File "/usr/lib/python3.9/subprocess.py", line 951, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.9/subprocess.py", line 1756, in _execute_child
self.pid = _posixsubprocess.fork_exec(
ValueError: embedded null byte
我已经尝试了一些没有奏效的解决方案,例如在 /dev/ttyACM0
的开盘时使用 wb
而不是 w
,以及使用 bytes()
从字符串转换为二进制。写出这些数据的正确方法是什么?
一般的shell,特别是echo
,无法处理任意二进制输入。幸运的是 Python 可以,因此您根本不需要这里的子流程。
with open("/dev/ttyACM0", "wb") as usb_pipe:
usb_pipe.write(USBpacket)
如果您真的想使用子流程,请尝试 cat
(但那确实是 useless use of cat
)。还要注意 open
如何使用 "wb"
以二进制模式打开文件句柄(普通 "w"
应用的编码同样不能容忍或不兼容任意二进制数据)。是的,如果您要发送的数据确实是二进制的,USBpacket
确实应该是一个 bytes
对象。
最后,也许注意到我更喜欢 snake_case
而不是 CamelCase
作为局部标量变量名;也许 USBpacket
也应该重命名以遵守 PEP-8 建议。
在 Debian Linux 系统上,我有一个 Python 脚本,用于准备要写出到位于 /dev/ttyACM0 的 USB CDC 设备的字符串。此写入发生在脚本末尾,如下所示...
USBpipe = open("/dev/ttyACM0", 'w')
shellCmd = subprocess.Popen(["echo", USBpacket], stdout = USBpipe)
USBpipe.close()
...其中 USBpacket 是一个字符串。如果我将其设为纯字符串,例如使用 USBpacket = "test"
,代码将正确执行,并且我已验证数据出现在 USB 设备上。但是,在正常执行期间,USBpacket 通过 chr()
函数获取附加到它的字节,其中一些可能为零。发生这种情况时,我收到此错误 运行 脚本:
Traceback (most recent call last):
File "/root/gpstoPIC.py", line 247, in <module>
shellCmd = subprocess.Popen(["echo", USBpacket], stdout = USBpipe)
File "/usr/lib/python3.9/subprocess.py", line 951, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/lib/python3.9/subprocess.py", line 1756, in _execute_child
self.pid = _posixsubprocess.fork_exec(
ValueError: embedded null byte
我已经尝试了一些没有奏效的解决方案,例如在 /dev/ttyACM0
的开盘时使用 wb
而不是 w
,以及使用 bytes()
从字符串转换为二进制。写出这些数据的正确方法是什么?
一般的shell,特别是echo
,无法处理任意二进制输入。幸运的是 Python 可以,因此您根本不需要这里的子流程。
with open("/dev/ttyACM0", "wb") as usb_pipe:
usb_pipe.write(USBpacket)
如果您真的想使用子流程,请尝试 cat
(但那确实是 useless use of cat
)。还要注意 open
如何使用 "wb"
以二进制模式打开文件句柄(普通 "w"
应用的编码同样不能容忍或不兼容任意二进制数据)。是的,如果您要发送的数据确实是二进制的,USBpacket
确实应该是一个 bytes
对象。
最后,也许注意到我更喜欢 snake_case
而不是 CamelCase
作为局部标量变量名;也许 USBpacket
也应该重命名以遵守 PEP-8 建议。