python如何实现程序只运行一个实例,并且运行后能接受命令行参数
就像看图软件那样,只打开一个实例,点击其他图片时显示新的图片或者有没有类似的开源项目 这个好像有点难 占用一个端口,开个 http server,另外的实例启动时直接把参数传递到这个 server 然后退出即可 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) 应该可以通过shell命令实时查看是否有其他相同的进程名称,并结束这些进程 Pwaerm 发表于 2024-5-11 09:09
AI提供了三种思路
我觉得最简单容易理解的是使用socket的端口
感谢,socket库解决问题了,问了问ai也用socket库解决了第二个问题 啥叫“运行后接收命令行参数”? 用端口不太合理, 一方面是较慢, 要处理不方便, 二是可能被别的程序占用, 还有其它难以预计的问题, 一般用的是互斥体,如果要保留原来的进程, 新创建的进程可将参数传给旧进程(通过窗口消息即可), 如果要保留新的, 那么发消息将旧的退出即可 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()
是不是可以用psutil.process_iter监控你现在运行的进程 如果存在就杀掉旧的运行新的 就可以一直保持运行唯一一个实例
页:
[1]