windows持续运行python_在windows中:双击运行Python程序、后台运行Python程序

在windows中:双击运行Python程序、后台运行Python程序

安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退。怎样避免闪退呢?

我们用python的日志输出程序来举例说明:

main.py中

#!/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的同一目录下)

python main.py

552284-20200908180040992-1346155798.png

2、升级版:vbs后台运行(无界面)

start_hidden.vbs 中(.vbs 文件必须放在main.py的同一目录下,且必须有 .bat 文件同在)

Set ws = CreateObject("Wscript.Shell")

ws.run "cmd /c start_show.bat",0

552284-20190424161421393-1570764357.png

二、windows中怎么快捷杀掉Python程序?

答:bat杀

stop_all_python.bat 中 (会杀死所有的Python程序)

taskkill /IM python.exe /F

552284-20190424161445515-764820119.png

三、其他说明:

1、带界面双击启动

双击start_show.bat

会出现cmd窗口,同时会产生日志文件夹

552284-20180919194709475-1143701797.png

552284-20180919194753388-586584893.png

2、不带界面后台运行程序

双击start_hidden.vbs

进程会增加一个python.exe进程,增加的python.exe进程为后台启动的,可以通过日志查看

552284-20180919195012268-794441727.png

552284-20180919195336526-73355929.png

3、杀死所有Python.exe进程

双击stop_all_python.bat

所有的Python进程都消失了,第1部中产生的cmd窗口也消失了。

552284-20180919195617733-1593495615.png

==========================我是一条优美的分割线==========================

一、问题:

552284-20191112230650559-782806517.png

二、答复:

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)运行前

552284-20191112232557887-1623073733.png

(2)双击start_show.bat(或者双击 start_hidden.vbs),运行后

552284-20191112232954632-1716554429.png

(3)结束main进程

552284-20191112233221645-1217338556.png

说明:进程查询的方式详见分割线之前部分。

如果有用,请给个赞呗!!!多谢。(^_^)

能力扩展:bat、dos控制多个后台程序启动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值