如何使用相对引用使用子进程运行复杂的python命令?

时间:2017-01-10 08:25:28

标签: python linux unix subprocess

我正在尝试使用Python执行此命令:

findSyntax = "find . -maxdepth 2 -name '.config' | cpio -updm ../test1/"
subprocess.Popen(findSyntax.split(' '))

但是这个命令不起作用。当我执行此命令时,它将开始列出所有文件(不仅仅是.config)。 maxdepth 2之外的目录...这是一个很长的列表。

我在这里缺少什么!有人能说出来吗?感谢。

注意:我已尝试运行subProcess.run并获得相同的结果。我只能使用os.system()命令获取查找部分。

编辑:我只是想澄清一下,这个命令会将找到的具有完整目录结构的文件完整地复制到新位置(如有必要,可以创建子目录)。我在bash终端上尝试过这个命令,它运行正常。但我无法使用Python。

  

EDIT2:所以,整个命令适用于os.system(),但我无法弄清楚如何使其与subprocess一起使用。 os.system()应该被弃用,所以我非常有兴趣使用subprocess找出解决方案。

1 个答案:

答案 0 :(得分:2)

请查看this good answerthis also helps

但实质上,您不能将上述子进程命令与管道一起使用。

让我们通过一个简单的例子来获取当前目录中的所有py文件:(ls | grep py
这打破了:

import subprocess
subprocess.call(['ls', '|', 'grep', 'py'])

因为子进程一次只进行一个进程,所以通过管道实际创建了2个进程。

简单但有限(平台)的方式是使用os.system

import os
os.system('ls | grep py')

这只是将shell命令传递给系统来执行。

但是,您应该通过定义管道来执行子进程:

# Get all files and pass the stdout to a pipe
p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
# then pass that pipe to another process as stdin and do part 2
output = subprocess.check_output(['grep', 'py'], stdin=p1.stdout)
print(output)

所以,你的例子的复制粘贴:

import subprocess
p1 = subprocess.Popen("find . -maxdepth 2 -name '.config'".split(), stdout=subprocess.PIPE)
output = subprocess.check_output("cpio -updm ../test1/".split(), stdin=p1.stdout)

os

os.system("find . -maxdepth 2 -name '.config' | cpio -updm ../test1/")