pyinstaller 로 만든 실행파일을 만들게 되면 종종 중복 실행되는 경우가 있습니다.
파이썬에서 중복 프로세스의 동작을 방지하려면 파일 기반의 락이나 OS별로 제공하는 프로세스 락 메커니즘을 사용할 수 있습니다. 예를 들어, fcntl 모듈을 사용하여 파일 락을 구현할 수 있습니다. 다음은 중복 프로세스를 방지하는 간단한 예제입니다:
import fcntl
import sys
def prevent_duplicate_process(lockfile):
fp = open(lockfile, 'w')
try:
# 파일에 락을 설정합니다.
fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
return fp
except IOError:
print("Another instance is already running.")
sys.exit(1)
if __name__ == "__main__":
lock_file_path = '/tmp/my_process.lock'
lock_fp = prevent_duplicate_process(lock_file_path)
# 프로세스의 메인 로직을 여기에 작성합니다.
try:
print("Process is running...")
# 여기에 원하는 코드 추가
finally:
# 파일 락 해제
fcntl.flock(lock_fp, fcntl.LOCK_UN)
lock_fp.close()
이 코드는 /tmp/my_process.lock라는 파일에 락을 설정하여 중복 실행을 방지합니다. 다른 인스턴스가 이미 실행 중인 경우, 프로그램은 메시지를 출력하고 종료됩니다. fcntl은 유닉스 계열 운영체제에서 사용 가능합니다.
윈도우에서는 msvcrt 모듈을 이용한 파일 잠금을 고려해볼 수 있습니다.
import os
import sys
import msvcrt
def prevent_duplicate_process(lockfile):
if os.path.exists(lockfile):
fp = open(lockfile, 'r+')
else:
fp = open(lockfile, 'w')
try:
# 파일에 락을 설정합니다.
msvcrt.locking(fp.fileno(), msvcrt.LK_NBLCK, 1)
return fp
except IOError:
print("Another instance is already running.")
sys.exit(1)
if __name__ == "__main__":
lock_file_path = 'C:\\path\\to\\your\\lockfile.lock'
lock_fp = prevent_duplicate_process(lock_file_path)
# 프로세스의 메인 로직을 여기에 작성합니다.
try:
print("Process is running...")
# 여기에 원하는 코드 추가
finally:
# 파일 락 해제
lock_fp.seek(0)
msvcrt.locking(lock_fp.fileno(), msvcrt.LK_UNLCK, 1)
lock_fp.close()
반응형