Shell命令从python失败,从shell正常

我有一个python脚本,可以从给定的输入生成许多shell命令.问题在于,当尝试执行生成的命令时,它会失败,但是当我自己运行生成的命令(即从命令行)时,它们将成功执行.这是生成的命令:find /home/me/downloader/0-29/ -...

我有一个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]

您能帮我了解问题出在哪里吗?

UPD:这是我用来执行生成的命令的功能:

def exec_command(command):
        process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
        output = process.communicate()[0]
        return output

解决方法:

由于您的命令是管道,因此必须设置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)

要么,

process = subprocess.Popen(command, shell=True)
output = process.communicate()[0]
return output

另外,请勿在带有管道的命令中使用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 = False,则shell不会删除它们.所以,我们必须.对于shell = False并与command.split()一起使用:

command="find /home/me/downloader/0-29/ -type f -iname *.rpm -exec cp {} /home/me/downloader/builds/0-29/ \;"

本文标题为:Shell命令从python失败,从shell正常

基础教程推荐