#やりたい事
WindowsとMac両方に使える方法で実行ファイルの多重起動を防止させたい。
困っている事
wxPythonではwx.SingleInstanceChecker(self.GetTitle())とかで多重起動を防止できようですが、tkinterで既にGUIは作成してしまいました。
Tkinterでも防止する方法は何があるのでしょうか?
試した事
##fcntlを使った方法
python
1import os 2import fcntl 3import time 4 5def process_lock(): 6 lockfile = os.path.splitext(os.path.abspath(__file__))[0] + '.lock' 7 lockfp = open(lockfile, "w") 8 try: 9 fcntl.flock(lockfp, fcntl.LOCK_EX | fcntl.LOCK_NB) 10 except IOError: 11 return 12 return lockfp 13 14def main(): 15 lock = process_lock() 16 if not lock: 17 print("lock error") 18 exit(1) 19 20 # 処理 21 time.sleep(360) 22 23if __name__ == '__main__': 24 main()
##プロセスの状況をOSなどから監視する
python
1# -*- coding: utf-8 -*- 2from os import path 3import subprocess 4 5# 2重起動を防ぐ 6file_name = path.basename(__file__) 7p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE) 8p2 = subprocess.Popen(["grep", file_name], stdin=p1.stdout, stdout=subprocess.PIPE) 9p3 = subprocess.Popen(["grep", "python"], stdin=p2.stdout, stdout=subprocess.PIPE) 10p4 = subprocess.Popen(["wc", "-l"], stdin=p3.stdout, stdout=subprocess.PIPE) 11p1.stdout.close() 12p2.stdout.close() 13p3.stdout.close() 14output = p4.communicate()[0].decode("utf8").replace('\n','') 15 16if int(output) != 1: 17 exit()
threading.Lock()を使用
pythorn
1#main 2 3##### 4#####tkinterにのフォームを作成するクラス 5##### 6 7if __name__ == "__main__": 8 9 # 2重起動防止 10 mutex = threading.Lock() 11 mutex.acquire() 12 # 初期状態の調整 (ファイルの確認など) 13 ff.ConfigFile() 14 15 root = ThemedTk() 16 app = Application(master=root) 17 app.mainloop() 18 mutex.release()
どちらも上手くいきませんでした、、
一般的にはどのような方法を使うのが普通なのでしょうか?
回答2件
あなたの回答
tips
プレビュー