栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python启动服务和进程,优雅的日志框架,好用的定时任务组件,在代码执行bat和exe不弹黑框,如何取当前exe绝对路径

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python启动服务和进程,优雅的日志框架,好用的定时任务组件,在代码执行bat和exe不弹黑框,如何取当前exe绝对路径

踩坑记录
  1. 在windows通过注册服务调用批处理是无法唤起windows视窗的,也无法识别%appdata%,%userprofile%这样的相对路径,视窗可以通过进程去调,而相对路径的写法,必须换为绝对路径
  2. 目前一般采用loguru作为python日志功能实现,用法比较符合使用java开发者的习惯
  3. 定时任务尽量不要使用schedule实现,使定时任务常驻cpu不太合理,而是使用sched
  4. os.system(),subprocess.run(XXX,shell=True),subprocess.run(XXX,shell=False)会弹出黑框
  5. os.path.dirname(–file–)在exe运行时值为c盘下的临时目录,使用os.path.realpath(sys.argv[0])可以得到exe在系统的绝对路径

话不多说,看代码

  1. windows开启服务
import win32service
from loguru import logger

# 开启服务
def start_service(name): #严格的服务名作为传参
    try:
        hSCManager = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
        handle = win32service.OpenService(hSCManager, name, win32service.SC_MANAGER_ALL_ACCESS)
        if handle:
            win32service.StartService(handle, None)
            win32service.CloseServiceHandle(handle)
            return True
    except Exception as e:
        logger.warning("重启服务异常:{}", e)

  1. 设置定时任务
import sched
from loguru import logger

def job():
	logger.warning("我使每60秒执行一次的定时任务")

job_handler = sched.scheduler(time.time, time.sleep)
# 此处添加任务
def perform(inc):
    job_handler.enter(inc, 0, perform, (inc,))
    job()
    
# 60秒一次,此函数在业务逻辑调用
def sheduled_job(inc=60):
    # 定时任务
    job_handler.enter(0, 0, perform, (inc,))
    job_handler.run()
    
  1. 启动进程
import os

progress_path = "C:/python3810"
def startProgress():
	
	os.chdir(progress_path)
	# 使用绝对路径
	os.popen(progress_path + '\python.exe')
	
  1. 不弹黑框,这里好记,统一用subprocess,脚本是run,exe是Popen
import subprocess
import os

def open_bat(bat_path):
	#config = subprocess.STARTUPINFO
	#config.dwFlags = subprocess.STARTF_USESHOWWINDOW
	#config.wShowWindow = subprocess.SW_HIDE
	#subprocess.Popen(command, startupinfo=config) #备用
	
	subprocess.run(command, shell=True)  #首选

def open_exe(exe_path):
	
	subprocess.Popen(exe_path, shell=True) #首选
	
	os.popen(exe_path) #亦可用
  1. 取exe运行时路径
import os
import sys
persistence_file = '与exe同目录外部资源文件名称'
exe_path = os.path.realpath(sys.argv[0]).replace('exe全名(exp:ToDesk.exe)', '')
persistence_file_path_absolute = exe_path + persistence_file
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/822841.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号