1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Win / Mac】Pythonでプロセスの多重起動を防止する

Last updated at Posted at 2024-11-18

目標

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)

解説

割愛(リクエストがあれば書きます)

謝辞

上記のコードの中には私が書いたものだけではなく、ネットを彷徨って見つけたコードのコピペも紛れています。それらのページを見つけることができなかったので出典がありません。原作者の方ごめんなさい。
もしコピペ元だと思われるページを見つけた方は教えていただけるとありがたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?