在windows中:双击运行Python程序、后台运行Python程序
在windows中:双击运行Python程序、后台运行Python程序
安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退。怎样避免闪退呢?
我们用python的日志输出程序来举例说明:
main.py中
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的同一目录下)
python main.py

2、升级版:vbs后台运行(无界面)
start_hidden.vbs 中(.vbs 文件必须放在main.py的同一目录下,且必须有 .bat 文件同在)
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c start_show.bat",0

二、windows中怎么快捷杀掉Python程序?
答:bat杀
stop_all_python.bat 中 (会杀死所有的Python程序)
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文件中,形如:
taskkill /pid 1235404 /f
del %0
注意:
pid后面的进程号是python程序随机生成的,所有获取pid进程号的时候也必须用python程序自动获取。
del %0 命令的作用是stop_main.bat文件运行结束后,删除stop_main.bat文件。目的是防止反复双击运行stop_main.bat文件,误删系统进程,导致系统崩溃。
2、实现
将main.py增加如下代码
# ========增加代码--开始========
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
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控制多个后台程序启动
https://www.cnblogs.com/andy9468/p/12603877.html
在windows中:双击运行Python程序、后台运行Python程序的更多相关文章
- iOS7程序后台运行
介绍 这次 iOS7 对程序后台运行进行了加强,但是仅仅是加强而已,要想像 Android 程序那样自由当然就别想了,苹果这么做主要还是出于电池使用时间考虑,但是这次的加强对大部分程序基本够用. 在介 ...
- Linux 程序后台运行
例子: shadowsocks 程序后台运行: sslocal -c /etc/shadowsocks-libev/config.json > /dev/>& & 参考: ...
- SpringBoot程序后台运行
使用nohup命令让进程后台运行 nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 & >日志文件名.log : ...
- python程序后台运行的实现
后台运行work()方法. work.py # -*- coding:utf-8 -*- def work(): print "running" import time time. ...
- python脚本后台运行
问题描述: 环境: CentOS6.4 一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本: python t ...
- Linux中如何让命令在后台运行
1.在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断. 2. 那大家可能又要问了,在后台执行的程序怎么使它恢复到前台来运行呢?很简 ...
- Linux nohup 程序后台运行
&方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/my ...
- ios程序后台运行设置(不是太懂)
文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...
- Linux --- 程序后台运行的几种方法
有时候我们运行一个程序,耗时比较长,所以在快下班的时候或是网络不稳定的时候就比较抓狂. 今天分享几个我在工作中用到的把程序放在后台运行的方法. nohup $ nohup --h Usage: noh ...
- nohup保证程序后台运行
前言 我们运行某些命令的时候,它会默认在前台执行.如果要进行其他操作,则需要先停掉此程序.然后就蛋疼了. 解决 碰到这种情况,我们可以使用"nohup"命令和"&am ...
随机推荐
- setTag,getTage复用
radioButtons = new RadioButton[rgMain.getChildCount()]; //遍历RadioGroupfor (int i = 0; i < radioBu ...
- Android——使用 Intent传递类
定义要传递的类事,必须加上 public class Movie implements Serializable { } 传入类: public void onItemClick(AdapterVie ...
- 【EF框架】EF DBFirst 快速生成数据库实体类 Database1.tt
现有如下需求,数据库表快速映射到数据库实体类 VS给出的两个选择都有问题,并不能实现,都是坑啊 EF .x DbContext 生成器 EF .x DbContext 生成器 测试结果如下 生成文件 ...
- 【Spring源码深度解析学习系列】Bean的加载(六)
Bean的加载所涉及到的大致步骤: 1)转换对应beanName 为什么需要转换beanName呢?因为传入的参数可能是别名,也可能是FactoryBean,所以需要一系列的解析,这些解析内容包括如下 ...
- VLC媒体视频播放器 v3.0.2官方版
https://www.videolan.org/ VLC media player http://www.pc6.com/softview/SoftView_52483.html VLC ...
- Post Office Protocol --- pop协议
https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
- 23种设计模式之策略模式(Strategy)
策略模式是一种对象的行为型模式,定义一系列算法,并将每一个算法封装起来,并让它们可以相互替换.策略模式比算法独立于使用它的客户而变化,其目的是将行为和环境分隔,当出现新的行为时,只需要实现新的策略类. ...
- python pandas 豆瓣电影 top250 数据分析
豆瓣电影top250数据分析 数据来源(豆瓣电影top250) 爬虫代码比较简单 数据较为真实,可以进行初步的数据分析 可以将前面的几篇文章中的介绍的数据预处理的方法进行实践 最后用matplotli ...
- [ZT] matlab中plot画图参数的设置
一.Matlab绘图中用到的直线属性包括: (1)LineStyle:线形 (2)LineWidth:线宽 (3)Color:颜色 (4)MarkerType:标记点的形状 (5)MarkerSize ...
- 【巷子】---webpack配置非CMD规范的模块
一.前言 webpack在配置多页面开发的时候 ,发现用 import 导入 Zepto 时,会报 Uncaught TypeError: Cannot read property 'createEl ...