zoukankan      html  css  js  c++  java
  • 在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 + "
    " + 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 + "
    " + 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

  • 相关阅读:
    「LibreOJ β Round #4」子集
    「LibreOJ β Round #4」框架
    「LibreOJ β Round #4」游戏
    [HNOI2008]GT考试
    [HNOI2008]水平可见直线
    UVA 1650 Number String
    [USACO14JAN]Recording the Moolympics
    UVA 1390 Interconnect
    UVA 12520 Square Garden
    [HNOI2008]神奇的国度
  • 原文地址:https://www.cnblogs.com/andy9468/p/9676719.html
Copyright © 2011-2022 走看看