2013-07-15 168 views
0

我正在創建一個文件,然後對其進行區分。python代碼是否按順序執行

我想對上一步創建的文件做差異,但我得到的文件不存在的錯誤。

這是我的代碼

os.popen("mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables --skip-extended-insert -c %s > %s.sql" % (database, filename)) 
os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH")) 

回答

1

os.popen()已經是deprecated since version 2.6。但是,要使代碼正常工作,您應該等待第一個過程完成(並創建輸出文件),然後再開始第二個過程。

的第一個命令的退出狀態是作爲文件對象的close()方法的返回值返回,這樣你就可以繼續前檢查,即:

pipe = os.popen("mysqldump --login-path=server1_mysql -e --opt " 
       "--skip-lock-tables --skip-extended-insert -c %s > %s.sql" % 
       (database, filename)) 
if pipe.close() is None: # no errors? 
    os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH")) 
+0

感謝兄弟,只有我們的代碼工程。這可能並不完美,但工作 – user22

+0

很高興聽到,但是你真的應該轉換你的代碼在某個時候使用'subprocess.call()' - 它絕對更好,通常使用起來相對更容易。 – martineau

5

os.popen is deprecated. Use the subprocess modulesubprocess.call將阻止主進程,直到命令完成。如果在執行mysqldump命令時發生錯誤,則應檢查返回碼retval。在這種情況下,你不能繼續diff

import subprocess 
import shlex 
with open("{f}.sql".format(f=filename), 'w') as fout: 
    retval = subprocess.call(
     shlex.split(
      """mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables 
      --skip-extended-insert -c %s""" % (database,)), 
     stdout=fout) 

if not retval == 0: 
    raise Exception('Error executing command: {r}'.format(r=retval)) 
else: 
    with open("{f}.PATCH".format(f=filename), 'w') as fout: 
     retval = subprocess.call(
      shlex.split("diff {w} {f}".format(w=weekly, f=filename)), 
      stdout=fout) 
+0

在這種情況下,沒有什麼'溝通',所以調用'proc.wait()'更簡單。但總的來說,是的(upvoted)。 – torek

+0

@torek:對。謝謝! – unutbu

+0

哦,另一件我剛纔注意到的事情是:使用'shlex.split'通常很好,但在這種情況下,字符串期望shell執行重定向,因此您需要'shell = True'並且不想分割串。或者(比試圖引用shell元字符更安全),在Python中打開輸出文件並在子進程調用中將其作爲'stdout ='傳遞。 – torek

0

一個超級簡單的方法就是用忙等待:

os.popen("mysqldump --login-path=server1_mysql -e --opt --skip-lock-tables --skip-extended-insert -c %s > %s.sql" % (database, filename)) 
while not os.path.isfile(filename): 
    sleep(0.05) # or some other interval 
os.popen("diff %s %s > %s" % (weekly, filename, filename+".PATCH")) 

編輯:

小心使用,留下因爲正在檢查的條件只是文件存在,而不是前面的過程完成寫入。

+1

繁忙的等待*很簡單,但不必要;這會導致競爭狀態:差異可能會在mysqldump已啓動但mysqldump完成之前啓動。 – torek

+0

果然,這可能有點簡單。我仍然認爲學習簡單(如果你喜歡上學),像忙碌的等待這樣的解決方案是有用的,在某些情況下,它仍然是必要的。但我同意在這種情況下它不是最理想的。 – Henrik