在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程序的更多相关文章

  1. iOS7程序后台运行

    介绍 这次 iOS7 对程序后台运行进行了加强,但是仅仅是加强而已,要想像 Android 程序那样自由当然就别想了,苹果这么做主要还是出于电池使用时间考虑,但是这次的加强对大部分程序基本够用. 在介 ...

  2. Linux 程序后台运行

    例子: shadowsocks 程序后台运行: sslocal -c /etc/shadowsocks-libev/config.json > /dev/>& & 参考: ...

  3. SpringBoot程序后台运行

    使用nohup命令让进程后台运行 nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 & >日志文件名.log : ...

  4. python程序后台运行的实现

    后台运行work()方法. work.py # -*- coding:utf-8 -*- def work(): print "running" import time time. ...

  5. python脚本后台运行

    问题描述: 环境: CentOS6.4 一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本: python t ...

  6. Linux中如何让命令在后台运行

    1.在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断. 2. 那大家可能又要问了,在后台执行的程序怎么使它恢复到前台来运行呢?很简 ...

  7. Linux nohup 程序后台运行

    &方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台:          /usr/local/my ...

  8. ios程序后台运行设置(不是太懂)

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...

  9. Linux --- 程序后台运行的几种方法

    有时候我们运行一个程序,耗时比较长,所以在快下班的时候或是网络不稳定的时候就比较抓狂. 今天分享几个我在工作中用到的把程序放在后台运行的方法. nohup $ nohup --h Usage: noh ...

  10. nohup保证程序后台运行

    前言 我们运行某些命令的时候,它会默认在前台执行.如果要进行其他操作,则需要先停掉此程序.然后就蛋疼了.   解决 碰到这种情况,我们可以使用"nohup"命令和"&am ...

随机推荐

  1. [XPath] XPath 与 lxml (二)XPath 语法

    XPath 选取节点时使用的表达式是一种路径表达式.节点是通过路径(path)或者步(steps)来选取的. 本章使用以下 XML 文档作为示例. <?xml version="1.0 ...

  2. React Native(五)——获取设备信息react-native-device-info

    心酸史: 自从接触rn开始后,越来越多的引入第三方组件而开始的配置文件,让自己一再头疼: 明明是按照官方文档一步一步的配置,为什么别人可以做到的自己却屡屡出错,真是哭笑不得--从微信分享react-n ...

  3. 扩展方法以及LinQ的学习

    我们今天学习的内容其实还是蛮多的,学习了自动属性,扩展方法,复习初始化器,以及LinQ的一些方法,其实感觉有些还是很熟悉的,在前面的学习过程中有时间感觉学习的知识知道了怎么使用,但是还没有在项目中使用 ...

  4. button按钮不能点击鼠标形状css 代码,禁用button按钮时鼠标形状

    cursor:not-allowed;

  5. codeforces水题100道 第三题 Codeforces Beta Round #47 A. Domino piling (math)

    题目链接:http://www.codeforces.com/problemset/problem/50/A题意:一个NxM的举行中最多能放多少个1x2的矩形.C++代码: #include < ...

  6. 【前端系列】移动前端开发之viewport的深入理解

    在页面上没有设置width所以样式显示有问题,本来选择的响应式模式的320*410结果看到页面的实际宽度确实980px. 本文转载自: 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的 ...

  7. 【linux系列】cenos7安装jdk

    一.下载jdk,我采用的jdk.tar.gz的安装包 二.创建jdk安装目录 三.安装包解压 四.jdk环境变量配置 五.使配置的环境变量生效 六.检查jdk是否安装成功

  8. 【大数据系列】HDFS初识

    一.HDFS介绍 HDFS为了做到可靠性(reliability)创建了多分数据块(data blocks)的复制(replicas),并将它们放置在服务集群的计算节点中(compute nodes) ...

  9. jQuery Sizzle选择器(一)

    1.浏览器对css选择器采取逆向(从右向左)解析的原因: 如果正向解析,例如「div div p em」,我们首先就要检查当前元素到 html 的整条路径,找到最上层的div,再往下找,如果遇到不匹配 ...

  10. 题目1003:A+B(按逗号分隔的A+B)

    题目链接:http://ac.jobdu.com/problem.php?pid=1003 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...