吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 747|回复: 9
收起左侧

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

[复制链接]
sakura32 发表于 2024-5-11 08:15
就像看图软件那样,只打开一个实例,点击其他图片时显示新的图片
或者有没有类似的开源项目

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yinlin 发表于 2024-5-11 08:23
这个好像有点难
havonz 发表于 2024-5-11 09:05
占用一个端口,开个 http server,另外的实例启动时直接把参数传递到这个 server 然后退出即可
Pwaerm 发表于 2024-5-11 09:09
AI提供了三种思路
我觉得最简单容易理解的是使用socket的端口

[Asm] 纯文本查看 复制代码
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监控你现在运行的进程 如果存在就杀掉旧的运行新的 就可以一直保持运行唯一一个实例
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-23 21:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表