Python 将bash(带*和管道)命令转换为Popen时出错
我有一个bash脚本,我想直接从Python调用它:Python 将bash(带*和管道)命令转换为Popen时出错,python,bash,popen,Python,Bash,Popen,我有一个bash脚本,我想直接从Python调用它: #!/bin/bash for usb in $(ls /dev/ttyUSB*); do echo $(udevadm info $usb | grep ID_SERIAL= | cut -d ' ' -f 2) $usb; done 我在第一部分遇到了错误: from subprocess import Popen Popen('ls /dev/ttyUSB*'.split()) 我知道这是由于Popen正在运行sh,并且它不支持
#!/bin/bash
for usb in $(ls /dev/ttyUSB*); do echo $(udevadm info $usb | grep ID_SERIAL= | cut -d ' ' -f 2) $usb; done
我在第一部分遇到了错误:
from subprocess import Popen
Popen('ls /dev/ttyUSB*'.split())
我知道这是由于Popen正在运行sh
,并且它不支持通配符,所以我尝试使用以下命令调用bash
:
from subprocess import Popen
Popen('/bin/bash ls /dev/ttyUSB*'.split())
或
但是得到
/bin/ls:/bin/ls:无法执行二进制文件
但是,这些文件确实存在:
ls /dev/ttyUSB*
输出:/dev/ttyUSB0/dev/ttyUSB1/dev/ttyUSB2/dev/ttyUSB3
在解决这个问题之后,我仍然必须理解如何在$[L/DEV/TyUSB*]中使用(在)中间(即-<代码>中的管道);(udevadm info$usb | grep
您能澄清一下您的问题是什么吗?您不是在调用bash脚本,而是从脚本中复制了命令。sh
支持通配符/globs-Popen
不运行sh
,这就是globs不工作的原因。Python有glob
模块来实现这一点-哪个c完全消除了调用ls
和管道化其输出的需要。因此,您希望a)将功能从bash移植到Python还是b)从Python调用bash?我想移植函数性,并考虑了glob
,但我仍然需要从shell调用udevadm info
,因此直接调用脚本似乎更容易。在这种情况下,只需逐字粘贴命令并设置shell=True
。例如,subprocess.run(“ls.| grep'\.py',shell=True)
。如果你想在这里有多个误解,请将“run”改为“call”,并将其作为答案发布,但最明显的是你需要bash-c”命令;更多的命令“
或sh-c”命令;更多的命令“
而不是没有-c
。对于call()的东西也不要使用Popen()
)
或破产()
将可靠、透明且容易地执行。您能澄清一下您的问题是什么吗?您没有调用bash脚本,而是从脚本复制了命令。sh
支持通配符/globs-Popen
不运行sh
,这就是globs不工作的原因。Python具有glob
模块r这完全消除了调用ls
和管道化其输出的需要。因此,您想a)将功能从bash移植到Python还是b)从Python调用bash?我想移植功能,并考虑了glob
,但我仍然需要从shell调用udevadm info
,因此调用脚本directly似乎更容易在这种情况下,只要逐字粘贴命令并设置shell=True
。例如,subprocess.run(“ls.|grep'\.py',shell=True)
。将“run”更改为“call”,并作为答案发布,如果您希望在这里有多个误解,但最明显的是您需要bash-c”命令;更多的命令“
或sh-c”命令;还有一些命令“
而不是没有-c
。对于那些call()
或ruite()
将可靠、透明且容易执行的操作,也不要使用Popen()
。
ls /dev/ttyUSB*