2010-11-09 80 views
2

我們有一個工作在這裏工作,輸入文件由SAS創建。該輸入文件然後由遺留應用程序讀取,並且遺留應用程序創建結果。 SAS然後讀取結果並對其進行總結。非程序員通常會逐一處理這些操作。所以這個人只是創建輸入文件。他們知道何時完成,然後他們運行遺留應用程序,並知道何時完成。然後他們運行彙總程序。如何檢查一個文件是否在python中的窗口上打開?

我有一種情況,我的老闆想跑100個左右的變化。我可以訪問共享網絡驅動器的3臺或4臺計算機。這是我的計劃:使用計算機A,我開始逐個創建100個輸入文件。使用計算機B,我在每個輸入文件上運行傳統程序。輸入準備就緒後,我想開始運行程序。因此,如果在計算機A上完成input1的創建,我想在計算機B上的input1上運行遺留應用程序,同時在計算機A上創建input2。我知道python最好,所以我可能會使用python將所有這些粘合在一起。

現在我知道我可以做很多事情,但我認爲這種方法已經足夠,並且可以讓我暫時完成工作。我沒有時間去設計和測試一個非常優雅的解決方案,它可以利用所有機器上的所有核心,或者使用數據庫來幫助我同步所有這些。我喜歡這樣的建議,,但我真的只想知道在python中是否有一種方法可以告訴網絡驅動器上的文件是否可以通過任何計算機上的任何應用程序進行寫入?如果沒有,我可能會想出一個愚蠢的方式來創建一個工作完成的指示器 - 就像創建一個文件「doneA」,如果它存在,則意味着「input1」文件已完成。例如。我會向創建輸入文件後創建指示器文件的sas程序添加一個步驟。

對不起,很長的解釋,但我只是不希望你浪費你的時間提供替代解決方案,我可能無法實現。

我已閱讀此question及其答覆。我不認爲我可以使用任何類似lsof b/c的文件,這些文件將在不同的計算機上打開。

回答

2

將輸出寫入臨時文件。寫完後,關閉它,然後將其重命名爲其他程序正在等待的名稱。這樣,文件只有在準備好被讀取時纔會出現。

+0

我決定使用這種方法。到目前爲止我還沒有遇到任何問題。我的Python代碼基本上是循環直到文件存在,然後做一些東西。我可能會更喜歡並將每個組件的信號傳遞給對方,但我可能永遠不會重新使用此代碼。謝謝! – oob 2010-11-13 21:26:07

1

如果在python中有一種方法可以判斷網絡驅動器上的某個文件是否開放供任何應用程序在任何計算機上寫入?

不是。

Windows會讓你打開文件幾次,真的很糟糕。

你必須使用一些明確的同步。而不是以100種不同的方式同步三個步驟中的每一個,我的首選是做以下事情。創建100步三步跳舞的副本。不要擔心步驟之間的同步。

for variant in range(100): 
    name= "variant_{0}.bat".format(variant) 
    with open(name,"w") as script: 
     print("run some SAS thing", file=script) 
     print("run some legacy thing", file=script) 
     print("run some SAS thing", file=script) 
    subprocess.Popen("start {0}".format(name), shell=True) 

我懷疑這會通過並行運行所有100來破壞處理器的壽命。

實際上,您可能不想在Python中實際使用subprocess.Popen()。實際上,您可能想要創建幾個可以並行運行幾個變體的「start_var_x」批處理文件。您可以創建一些運行一系列處理步驟的主bat文件。每個步驟都會啓動幾個並行的3步驟變體。

+0

這很有趣。問題是我只有一臺計算機上的傳統程序的許可證,這恰好是我的個人計算機!好玩的東西。所以我計劃在我的電腦上使用電腦B.但是,您的解決方案雖然可以工作,但速度並不像我想的那麼快,但如果我走這條路線,我只會跑過夜。 – oob 2010-11-09 21:17:27

相關問題