2013-06-29 109 views
2

我有很多的Python腳本我想管背靠背約1000倍,改變了輸入文件爲每個使用Python批量運行其他的Python腳本

我以前用的是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

os.system()有一個問題,即直接打印命令行輸出,儘管您不希望它被打印。例如)

如果要執行ls命令並將輸出保存到文件或變量,system()不起作用。使用

Popen

這POPEN真叫使用os.system()已經過時了。這有點難以理解,但它更有用。

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來並行處理您的工作負載。