我正在尝试使用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
找出解决方案。
答案 0 :(得分:2)
请查看this good answer和this 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/")