2013-09-23 37 views
-1

可見我有一個Python腳本,並連續兩兩件事:如何使子在python

  1. 生成一堆文件,然後
  2. 左右移動文件。

我通過所有文件的文件夾與迭代移動文件:

for filename in os.listdir("."): 
    if filename.endswith(".rmp"): 

其中.rmp文件是完全由第一子產生的。
所以現在運行一次只能得到文件夾中的.rmp文件,第二步不管出於何種原因都看不到它們,但是它在第二次正常運行時正確移動它們。
那麼如何讓它在第一次嘗試中識別所有文件。爲什麼他們首先看不到?

這裏的代碼

var = os.getcwd() 
pipe = subprocess.Popen(["perl", "./runtest.pl", var]) 


for filename in os.listdir("."): 
    if filename.endswith(".rmp"): 
     print "woopee" 
+3

比賽條件? – FatalError

+0

完整的代碼可能會有幫助,尤其是確定是否存在競爭條件... – luqmaan

回答

2

我想你不關閉文件。這可能會延遲寫入並導致os.listdir無法獲取所有文件。

一個很好的方式,以確保你總是關閉的文件是:

with open('filename.rmp', 'w') as f: 
    f.write(...) 

這是不錯的,因爲它有例外的效果很好,使你確保你不會忘記他們打開。

一旦一切都被關閉,他們應該在os.listdir(.)

2

顯示當你創建一個子進程,它執行與當前進程並行。由於你的進程在你的perl腳本運行時繼續運行,這是你的程序讀取目錄和寫入它的文件的perl進程之間的競賽(這是你的競賽條件)。

要解決它,你應該添加一個調用.wait()

var = os.getcwd() 
p = subprocess.Popen(["perl", "./runtest.pl", var]) 
p.wait() # wait for perl to exit 

for filename in os.listdir("."): 
    if filename.endswith(".rmp"): 
     print "woopee" 

我還想補充一點,這將是使用glob模塊的好機會:

from glob import glob 
var = os.getcwd() 
p = subprocess.Popen(["perl", "./runtest.pl", var]) 
p.wait() 

for filename in glob('*.rpm'): 
    print "woopee" 
+0

非常酷,它工作感謝 –

0

看起來像你不需要任何與子進程的通信,你只需要運行一個子進程並等待退出。 subprocess.call()更方便:

var = os.getcwd() 
retcode = subprocess.call(["perl", "./runtest.pl", var]) 
if retcode != 0: 
    # do some error handling, the subprocess returned nonzero exit code 

# process the file generated by subprocess