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 建议。