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上运行。