我有一个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
与许多参数,包括。 |
和grep
和xargs
– 这些都不是找到的参数。
你想做的事情可能是要求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