使用python批量运行其他python脚本

时间:2013-06-29 05:46:09

标签: python command-line-interface

我有很多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')

3 个答案:

答案 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

这个Popen真的让os.system()过时了。理解起来有点困难,但它更有用。