我有很多python脚本我想连续管道大约1000次,改变每个输入文件
我之前使用bash shell脚本执行此操作,但我现在需要它在Windows机器上工作。
这是python,有问题的行被注释掉了
namecount = 0
for file in files:
in_filestring = "test_" + str(namecount)
out_filestring = "out_ + str(namecount)
namecount += 1
#Run this on the command line: python pre.py < in_filestring | filter.py | a_filter.py > out_filestring
我可以在这里使用它还是有更好的方法?我问,因为我正在阅读子进程http://docs.python.org/2/library/subprocess.html。显然它取代了过时的os.system,但我还不明白如何使用它。
import os
os.system('system command you want to run')
答案 0 :(得分:1)
subprocess.call应该没问题。基本是,
call(["args" in comma separated])
以下是链接http://docs.python.org/2/library/subprocess.html#using-the-subprocess-module。
在你的情况下,尝试这样的事情,
from subprocess import call
...
...
call(["python", "pre.py", "<", filestring, "|", "filter.py", "|", "a_filter.py", ">", "out_filestring"])
答案 1 :(得分:1)
要调用通过管道连接的多个程序,os.system
是最简单的方法。您也可以使用subprocess.Popen
,但是您必须自己连接输入和输出:
p = subprocess.Popen("echo 'asdf'".split(), stdout=subprocess.PIPE)
q = subprocess.Popen("sed s/a/g/".split(), stdin=p.stdout, stdout=subprocess.PIPE)
q.stdout.read()
类似的问题有comprehensive answer。
但是,既然你想调用python程序,你可以检查它们是否可以在你的进程中使用。
如果他们没有这样做,你可以使用生成器作为输入和输出将它们转换为函数。然后你可以像这样连接它们:
output_file.writelines(a_filter(filter(pre(input_file)))
这可以节省您启动一千个进程的开销。作为奖励,您可以使用multiprocessing module's pool来并行化工作量。
答案 2 :(得分:0)
os.system()
有一个问题,即它直接打印命令行输出,但您不希望它被打印。例如)
如果要执行ls
命令并将输出保存到文件或变量,system()无效。使用
这个Popen真的让os.system()过时了。理解起来有点困难,但它更有用。