Python 将bash(带*和管道)命令转换为Popen时出错

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,并且它不支持

我有一个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
,并且它不支持通配符,所以我尝试使用以下命令调用
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*