sakura32 发表于 2024-5-11 08:15

python如何实现程序只运行一个实例,并且运行后能接受命令行参数

就像看图软件那样,只打开一个实例,点击其他图片时显示新的图片
或者有没有类似的开源项目

yinlin 发表于 2024-5-11 08:23

这个好像有点难

havonz 发表于 2024-5-11 09:05

占用一个端口,开个 http server,另外的实例启动时直接把参数传递到这个 server 然后退出即可

Pwaerm 发表于 2024-5-11 09:09

AI提供了三种思路
我觉得最简单容易理解的是使用socket的端口

try:
    # 尝试创建一个套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 尝试绑定到指定的端口
sock.bind(("127.0.0.1", 6012))
    # 监听连接
sock.listen(1)


except socket.error as e:
if e.errno == socket.errno.EADDRINUSE:
      # 地址已被占用,表示另一个实例正在运行
print("端口已经被占用,程序已经在运行")
sys.exit(1)

kolt1911 发表于 2024-5-11 09:49

应该可以通过shell命令实时查看是否有其他相同的进程名称,并结束这些进程

sakura32 发表于 2024-5-11 10:12

Pwaerm 发表于 2024-5-11 09:09
AI提供了三种思路
我觉得最简单容易理解的是使用socket的端口



感谢,socket库解决问题了,问了问ai也用socket库解决了第二个问题

retsyo 发表于 2024-5-11 11:25

啥叫“运行后接收命令行参数”?

boxer 发表于 2024-5-11 14:16

用端口不太合理, 一方面是较慢, 要处理不方便, 二是可能被别的程序占用, 还有其它难以预计的问题, 一般用的是互斥体,如果要保留原来的进程, 新创建的进程可将参数传给旧进程(通过窗口消息即可), 如果要保留新的, 那么发消息将旧的退出即可

zhangwei0988 发表于 2024-5-11 14:29

import argparse
import os
import signal
from threading import Lock

# 创建一个全局锁对象
lock = Lock()

def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='Your program description')
    parser.add_argument('--param1', type=str, help='Description of parameter 1')
    parser.add_argument('--param2', type=int, help='Description of parameter 2')
    args = parser.parse_args()

    # 尝试获取锁
    try:
      lock.acquire()
    except Exception as e:
      print(f'Another instance is already running. Exiting.')
      return

    # 如果成功获取锁,执行程序逻辑
    print(f'Running with parameters: {args}')
    # ... your program logic here ...

    # 在程序结束时释放锁
    lock.release()

if __name__ == '__main__':
    # 为了防止意外信号导致程序退出而不释放锁,设置信号处理器
    signal.signal(signal.SIGINT, lambda sig, frame: lock.release())
    signal.signal(signal.SIGTERM, lambda sig, frame: lock.release())

    main()

stone102 发表于 2024-5-11 15:12

是不是可以用psutil.process_iter监控你现在运行的进程 如果存在就杀掉旧的运行新的 就可以一直保持运行唯一一个实例
页: [1]
查看完整版本: python如何实现程序只运行一个实例,并且运行后能接受命令行参数