在windows中:双击运行Python程序、后台运行Python程序
在windows中:双击运行Python程序、后台运行Python程序
安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退。怎样避免闪退呢?
我们用python的日志输出程序来举例说明:
main.py中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #!/usr/bin/python # -*- coding:utf-8 -*- import sys if sys.version_info < ( 3 , 0 ): # 设置python2的编码格式为utf-8 reload (sys) sys.setdefaultencoding( 'utf8' ) import os import logging import time # 如果日志文件夹不存在,则创建 log_dir = "log" # 日志存放文件夹名称 log_path = os.getcwd() + os.sep + log_dir if not os.path.isdir(log_path): os.makedirs(log_path) # 设置logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) main_log_handler = logging.FileHandler( log_dir + "/dd_%s.log" % time.strftime( "%Y-%m-%d_%H-%M-%S" , time.localtime(time.time())), mode = "w+" , encoding = "utf-8" ) main_log_handler.setLevel(logging.DEBUG) formatter = logging.Formatter( "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s" ) main_log_handler.setFormatter(formatter) logger.addHandler(main_log_handler) # 控制台打印输出日志 console = logging.StreamHandler() # 定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象 console.setLevel(logging.INFO) # 设置要打印日志的等级,低于这一等级,不会打印 formatter = logging.Formatter( "%(asctime)s - %(levelname)s: %(message)s" ) console.setFormatter(formatter) logging.getLogger('').addHandler(console) while True : time_stamp = time.time() # print("时间戳",time_stamp) logger.info( "时间戳 %s" % time_stamp) sec = 3 logger.info( "睡眠 %s 秒" % sec) time.sleep(sec) |
一、双击运行python的具体实现
1、bat启动
start_show.bat 中(.bat文件 必须放在main.py的同一目录下)
1 | python main.py |
2、升级版:vbs后台运行(无界面)
start_hidden.vbs 中(.vbs 文件必须放在main.py的同一目录下,且必须有 .bat 文件同在)
1 2 | Set ws = CreateObject( "Wscript.Shell" ) ws.run "cmd /c start_show.bat" , 0 |
二、windows中怎么快捷杀掉Python程序?
答:bat杀
stop_all_python.bat 中 (会杀死所有的Python程序)
1 | taskkill / IM python.exe / F |
三、其他说明:
1、带界面双击启动
双击start_show.bat
会出现cmd窗口,同时会产生日志文件夹
2、不带界面后台运行程序
双击start_hidden.vbs
进程会增加一个python.exe进程,增加的python.exe进程为后台启动的,可以通过日志查看
3、杀死所有Python.exe进程
双击stop_all_python.bat
所有的Python进程都消失了,第1部中产生的cmd窗口也消失了。
==========================我是一条优美的分割线==========================
扩展:答复网友MR_Mason
一、问题:
二、答复:
1、思路
windows下的:taskkill /IM python.exe /F 命令会将所有python解释器进程全部杀死。
windows下的:taskkill /pid 1235404 /f 命令会将进程编号为1235404的进程杀死。那么我们要做的就是找到main.py启动时的进程编号,然后在写入到名为stop_main.bat文件中,形如:
1 2 | taskkill /pid 1235404 /f del %0 |
注意:
pid后面的进程号是python程序随机生成的,所有获取pid进程号的时候也必须用python程序自动获取。
del %0 命令的作用是stop_main.bat文件运行结束后,删除stop_main.bat文件。目的是防止反复双击运行stop_main.bat文件,误删系统进程,导致系统崩溃。
2、实现
将main.py增加如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # ========增加代码--开始======== def produce_stop_bat(pid, tmpfile= "stop_xxx.bat" ): # 待写入内容 stop_cmd = 'taskkill /pid ' + str(pid) + ' /f' # 关闭指定进程 del_self_cmd = "del %0" # 删除自身文件 # 文件路径和名称 tmp_all = "stop_" + tmpfile + ".bat" # 写入文件 with open ( file =tmp_all, mode= "w" ) as f: f.write(stop_cmd + "\n" + del_self_cmd) # 进程号 pid = os.getpid() # 本文件名(不含后缀.py) myfilename = os.path. split (__file__)[-1]. split ( "." )[0] # 生成关闭进程的脚本文件 produce_stop_bat(pid, myfilename) # ========增加代码--结束======== |
增加代码后,完整的main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import os import logging import time # ========增加代码--开始======== def produce_stop_bat(pid, tmpfile = "stop_xxx.bat" ): # 待写入内容 stop_cmd = 'taskkill /pid ' + str (pid) + ' /f' # 关闭指定进程 del_self_cmd = "del %0" # 删除自身文件 # 文件路径和名称 tmp_all = "stop_" + tmpfile + ".bat" # 写入文件 with open ( file = tmp_all, mode = "w" ) as f: f.write(stop_cmd + "\n" + del_self_cmd) # 进程号 pid = os.getpid() # 本文件名(不含后缀.py) myfilename = os.path.split(__file__)[ - 1 ].split( "." )[ 0 ] # 生成关闭进程的脚本文件 produce_stop_bat(pid, myfilename) # ========增加代码--结束======== # 如果日志文件夹不存在,则创建 log_dir = "log" # 日志存放文件夹名称 log_path = os.getcwd() + os.sep + log_dir if not os.path.isdir(log_path): os.makedirs(log_path) # 设置logging logger = logging.getLogger() logger.setLevel(logging.DEBUG) main_log_handler = logging.FileHandler( log_dir + "/dd_%s.log" % time.strftime( "%Y-%m-%d_%H-%M-%S" , time.localtime(time.time())), mode = "w+" , encoding = "utf-8" ) main_log_handler.setLevel(logging.DEBUG) formatter = logging.Formatter( "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s" ) main_log_handler.setFormatter(formatter) logger.addHandler(main_log_handler) # 控制台打印输出日志 console = logging.StreamHandler() # 定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象 console.setLevel(logging.INFO) # 设置要打印日志的等级,低于这一等级,不会打印 formatter = logging.Formatter( "%(asctime)s - %(levelname)s: %(message)s" ) console.setFormatter(formatter) logging.getLogger('').addHandler(console) while True : time_stamp = time.time() # print("时间戳",time_stamp) logger.info( "时间戳 %s" % time_stamp) sec = 3 logger.info( "睡眠 %s 秒" % sec) time.sleep(sec) |
3、效果展示
(1)运行前
(2)双击start_show.bat(或者双击 start_hidden.vbs),运行后
(3)结束main进程
说明:进程查询的方式详见分割线之前部分。
如果有用,请给个赞呗!!!多谢。(^_^)
能力扩展:bat、dos控制多个后台程序启动
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 使用 Dify + LLM 构建精确任务处理应用