Python:如何使用subprocessredirect输出?

我在命令行中做了什么:

cat file1 file2 file3 > myfile 

我想用python做什么:

 import subprocess, shlex my_cmd = 'cat file1 file2 file3 > myfile' args = shlex.split(my_cmd) subprocess.call(args) # spits the output in the window i call my python program 

更新:os.system不鼓励,尽pipe在Python 3中仍然可用。


使用os.system

 os.system(my_cmd) 

如果你真的想使用subprocess,下面是解决scheme(大部分是从subprocess的文档中提取的):

 p = subprocess.Popen(my_cmd, shell=True) os.waitpid(p.pid, 0) 

OTOH,你可以完全避免系统调用:

 import shutil with open('myfile', 'w') as outfile: for infile in ('file1', 'file2', 'file3'): shutil.copyfileobj(open(infile), outfile) 

为了回答你原来的问题,为了redirect输出,只需将stdout参数的打开文件句柄传递给subprocess.call

 # Use a list of args instead of a string input_files = ['file1', 'file2', 'file3'] my_cmd = ['cat'] + input_files with open('myfile', "w") as outfile: subprocess.call(my_cmd, stdout=outfile) 

但正如其他人所指出的那样,使用像cat这样的外部命令是完全无关紧要的。

@PoltoS我想join一些文件,然后处理结果文件。 我以为用猫是最简单的select。 有更好的/ pythonic的方式来做到这一点?

当然:

 with open('myfile', 'w') as outfile: for infilename in ['file1', 'file2', 'file3']: with open(infilename) as infile: outfile.write(infile.read()) 

一个有趣的情况是通过附加类似的文件来更新文件。 那么在这个过程中不需要创build一个新的文件。 在需要附加大文件的情况下特别有用。 这里有一个使用python直接使用terminal命令行的可能性。

 import subprocess32 as sub with open("A.csv","a") as f: f.flush() sub.Popen(["cat","temp.csv"],stdout=f) 
 size = 'ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 dump.mp4 > file' proc = subprocess.Popen(shlex.split(size), shell=True) time.sleep(1) proc.terminate() #proc.kill() modify it by a suggestion size = "" with open('file', 'r') as infile: for line in infile.readlines(): size += line.strip() print(size) os.remove('file') 

当你使用进程时,进程必须被终止。这是一个例子。如果你不杀死进程, 文件将是空的,你什么都不能读。它可以在Windows上运行,我不能确保它可以在Unix上运行。