shell命令从python失败,从shell中ok

我有一个python脚本,从给定的input生成一些shell命令。 问题是,当它试图执行生成的命令时,它会失败,但是当我自己运行生成的命令(即从命令行),它们被成功执行。

这是生成的命令:

  find / home / me / downloader / 0-29 / -type f |  grep -i .rpm $ |  xargs -i cp {} / home / me / downloader / builds / 0-29 / 

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

 发现:path必须在expression式之前:|
用法:find [-H] [-L] [-P] [-Olevel] [-D help | tree | search | stat | rates | opt | exec] [path ...] [expression]

你能帮我理解问题是什么吗?

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

  def exec_command(command):
         process = subprocess.Popen(command.split(),stdout = subprocess.PIPE)
         output = process.communicate()[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) 

要么,

 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'的单引号是为了保护shell不受shell扩展的影响。 在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/ \;" 

我相信你所做的是你开始一个单一的程序称为find与许多参数,包括。 |grepxargs – 这些都不是找到的参数。

想做的事情可能是要求bash运行find ,然后把结果传给grep等等。一种方法是使用两个参数( -c )和一个完整的字符串incl来执行一个名为bash命令。 管道命令,例如

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