我正在尝试将其中一个 shell 命令用于 python 脚本,但这里遇到了一些语法错误。
该命令的描述是从这里
echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"
此命令在终端上运行良好,但尝试将其导入 python 脚本
import subprocess
cmd = "/dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/""
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
out, err = p.communicate()
print out
print err
sprintf 语句出现语法错误,该错误没有太多解释,或者不像模数 (%)
答案1
你不能在“内”使用“。你的命令被分成几部分
cmd = " /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/" "
第 1 行和第 7 行的“”与第 5 行和第 6 行的“”相冲突。您需要对它们进行转义。第 3 行正确地对它们进行了转义。
查看字符串文字部分。
未经测试,但您可能需要这样做:
cmd = " /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf(\"%03d\", $1); print}'` | tr \" \" \"/\" "
也许这也有效:
cmd = "/dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf('%03d', $1); print}'` | tr ' ' '/'"
我把“ 改成了 ’ 。