2017-11-11 210 views
2

我正在開發一個更大的系統內部有兩個腳本。讓我們打電話給一個foo.py和另一個bar.py如果正在執行另一個腳本,防止運行python腳本

foo創建bar之後將讀取和刪除的文件。現在,如果foo正在運行並正在處理某個文件,bar將在foo完成之前處理同一個文件,從而導致混亂。

foobar由其他內容自動啓動,而不是由運行它們的人手動啓動。 如何確保如果foo正在處理文件,bar無法啓動?

我曾經想過編輯他們都讓foo在開始執行寫入1到一個文本文件和一個當它完成0,並且使bar閱讀文本文件,檢查wheter它可以啓動。但我真的不知道這是最優雅的解決方案,而且我不希望阻止bar如果foo在執行過程中不斷出現故障,剩下的文件在1

+0

難道你不能在子過程中執行foo,並且使用'Popen.poll()'等待foo完成(通過成功或失敗)嗎?另請參閱https://stackoverflow.com/q/43274476/2923755 –

+0

您是否查看了文件鎖定? – 2017-11-11 17:13:30

+0

新手在這裏,沒有關於子進程或文件鎖定的標題。要做我自己的研究,但是,你們能指出任何好的來源嗎? –

回答

1

您可以使用subprocess

在你的主文件:

import subprocess 


def main(): 
    p = subprocess.Popen(['python', 'foo.py']) 
    res = p.wait() 
    if res == 0: 
     print("foo did ok") 
     # execute bar.py 
    else: 
     print("foo failed along the way") 

在foo.py,確保與代碼0退出,如果一切正常: exit(0)(這將返回在主腳本中爲res)。

如果您想在等待foo完成時執行其他操作,也可以使用poll()

def main(): 
    p = subprocess.Popen(['python', 'foo.py']) 

    while not p.poll()==0: 
     print("wait for foo") 
     #do some other magic. but make sure to have a break condition 
     # e.g. if foo takes too long. 
0

的可能的策略:

  • foo build todo.foo
  • 完成後重命名爲todo.bar
  • bar照看todo.bar,計算完成後刪除它。
+0

這與他的「寫1然後0」策略不一樣嗎?如果foo在這裏失敗,bar會被「阻止」,但是沒有看到文件 –

+0

你是對的,你只需要少一個文件來管理。但如果foo失敗,酒吧使用它是個好主意嗎? –

+0

準確地說,我的想法也是大聲笑,但這就是他想要的嘿嘿 –

0
import fcntl 

pid_file = 'mysoftware.pid' 
fp = open(pid_file, 'w') 
try: 
    fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB) 
except IOError: 
    # another instance is running 
    print("already running") 
    sys.exit(1) 

這對我的作品。

相關問題