python中的Shell命令失败,Shell中的ok命令失败

python中的Shell命令失败,Shell中的ok命令失败,python,linux,bash,shell,Python,Linux,Bash,Shell,我有一个python脚本,它从给定的输入生成许多shell命令。问题是,当它尝试执行生成的命令时,它失败了,但是当我自己运行生成的命令时(即从命令行),它们成功地执行了 以下是生成的命令: find/home/me/downloader/0-29/-type f|grep-i.rpm$|xargs-i cp{}/home/me/downloader/builds/0-29/ 以下是由python脚本运行时的错误消息: find: paths must precede expression: |

我有一个python脚本,它从给定的输入生成许多shell命令。问题是,当它尝试执行生成的命令时,它失败了,但是当我自己运行生成的命令时(即从命令行),它们成功地执行了

以下是生成的命令:
find/home/me/downloader/0-29/-type f|grep-i.rpm$|xargs-i cp{}/home/me/downloader/builds/0-29/

以下是由python脚本运行时的错误消息:

find: paths must precede expression: | Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 查找:路径必须位于表达式之前:| 用法:find[-H][L][P][Olevel][D help | tree | search | stat | rates | opt | exec][path…][expression] 你能帮我理解问题是什么吗

UPD:以下是我用于执行生成的命令的函数:
def exec_命令(命令):
process=subprocess.Popen(command.split(),stdout=subprocess.PIPE)
输出=进程。通信()[0]

返回输出

由于您的命令是一个管道,因此必须设置
shell=True
,以便子流程将命令按原样发送到shell:

command = 'find /home/me/downloader/0-29/ -type f | grep -i .rpm$ | xargs -i cp {} /home/me/downloader/builds/0-29/'
subprocess.call(command, shell=True)
或者

另外,不要在python中对带有管道的命令执行拆分。这将导致将
find
作为其参数之一传递,而不是作为shell运算符传递

似乎还可以简化该命令:

command="find /home/me/downloader/0-29/ -type f -iname '*.rpm' -exec cp {} /home/me/downloader/builds/0-29/ \;"
由于上面的内容不再是管道,只需稍加修改,就可以将其拆分并提供给shell=False的子流程。修改是,
'*.rpm'
周围的单引号用于保护glob不受shell扩展的影响。如果shell=False,则shell不会删除它们。所以,我们必须这样做。对于shell=False并与
command.split()一起使用时:

我相信你要做的就是启动一个名为
find
的程序,它有许多参数,包括
grep
xargs
——这些都不是要查找的参数

您要做的可能是让bash运行
find
,然后将结果通过管道传输到
grep
,等等。一种方法是执行一个名为
bash
的命令,其中包含两个参数(
-c
)和一个包含管道命令的整个字符串,例如

process = subprocess.Popen(["bash", "-c", "cat /etc/issue | grep a"], stdout=subprocess.PIPE)
output=process.communicate()[0]
print output

您是如何从python中执行该行的?提供一些代码?您可能需要引用python中的命令来执行…我认为您在简化版本中的引用弄错了。@user2357112谢谢。修复了它。
*.rpm
周围的单引号仅在shell处理命令行时才有必要,以防止模式扩展;然后,shell在将文本字符串传递给
find
之前删除引号。如果使用
shell=False
,您希望不使用单引号。
process = subprocess.Popen(command, shell=True)
output = process.communicate()[0]
return output
command="find /home/me/downloader/0-29/ -type f -iname '*.rpm' -exec cp {} /home/me/downloader/builds/0-29/ \;"
command="find /home/me/downloader/0-29/ -type f -iname *.rpm -exec cp {} /home/me/downloader/builds/0-29/ \;"
process = subprocess.Popen(["bash", "-c", "cat /etc/issue | grep a"], stdout=subprocess.PIPE)
output=process.communicate()[0]
print output