目標
singleton() # 既に同じプロセスが存在する場合はここで終了。なければスルー。
環境構築
標準ライブラリのみで動作するため、追加のインストールは必要ありません。
コード
import sys
if sys.platform == "win32":
import ctypes
UNIQUE_STRING = "このアプリでしか使われないであろう、一意の文字列"
def singleton():
Kernel32 = ctypes.windll.Kernel32
mutex = Kernel32.CreateMutexA(0, 1, UNIQUE_STRING)
result = Kernel32.WaitForSingleObject(mutex, 0)
if result == 0x00000102:
sys.exit(-1)
elif sys.platform == "darwin":
import subprocess
from os import path
import __main__
def singleton():
if getattr(sys, "frozen", False):
file_name = "ビルド後のアプリ名(hoge.appならhoge)" # nuitkaやpyinstallerでビルドする場合
else:
file_name = path.basename(__main__.__file__) # Pythonインタープリタから実行する場合
p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", file_name], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(["wc", "-l"], stdin=p2.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
p2.stdout.close()
output = p3.communicate()[0].decode("utf8").replace("\n", "")
if int(output) > 2:
sys.exit(-1)
解説
割愛(リクエストがあれば書きます)
謝辞
上記のコードの中には私が書いたものだけではなく、ネットを彷徨って見つけたコードのコピペも紛れています。それらのページを見つけることができなかったので出典がありません。原作者の方ごめんなさい。
もしコピペ元だと思われるページを見つけた方は教えていただけるとありがたいです。