zoukankan      html  css  js  c++  java
  • python执行cmd命令 python创建子进程

    项目需求描述:

    1.第一阶段:首先有一个本地机器人项目有个Bot进程负责接收服务端的任务,并执行

    2.第二阶段:服务端想要控制Bot的启动停止,并且监控状态,机器人项目就加了个Bot_Runner主进程产生Bot子进程,Bot_Runner主进程监听服务端的卡夫卡服务器接受任务操作Bot子进程,从而实现服务端对Bot的控制

      1)python执行cmd命令创建并控制子进程

      2)python使用卡夫卡

      3)pipenv 代替pip管理项目

    3.第三阶段:Bot_Runner主进程和Bot子进程的代码更新后,需要登录每台云服务器去升级代码安装一堆依赖,太麻烦,就做了一个git_helper项目,通过卡夫卡接收服务端clone/pull命令,对机器人项目进行远程更新

      1)python操作git

      2)python杀死无关的python进程

      3) python删除文件夹

    4.第四阶段: git_helper项目虽然可以更新机器人代码,但是这个项目还是要手动clone安装依赖什么的,这个活也挺麻烦,就想把git_helper项目的 clone+依赖安装+启动 做成windows服务,开机自启,搞来搞去各种出错就放弃做成服务,做成了个exe,双击就好了

      1)python打包程序为exe

    这个流程下来会频繁执行cmd命令,就总结一下python执行cmd命令的方式:

    一、python使用subprocess执行cmd命令创建进程

    特点:

    1.subprocess.Popen创建的子进程随主进程结束而终止(好像是,记不太清楚了,懒得试,哈哈哈)

    2.可以通过popen获得子进程运行状态,并且控制子进程

    详见:subprocess创建子进程,subprocess执行py脚本文件,subprocess使用pipenv管理的虚拟环境执行子进程

    二、python使用os.syetem执行cmd命令创建进程

    特点:

    system 函数可以将字符串转化成命令在服务器上运行

    其原理是每一条 system 函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。
    system创建的子进程运行不依赖于主进程,主进程结束子进程也能正常运行

    根据切换盘符方式不同,执行多条语句有不同的语法,如下:

    2.1 os.seytem 直接cd切换

    # 第一种 os.system执行cd命令切换子进程盘符,执行其他文件
    # 当前目录D:gittest,要再D:/gittest/代码/weebot_wxbot目录中安装依赖,并启动666.py
    os.system('cd ..') # 这个只能改变os创建的子进程的目录,不能改变当前主进程工作目录
    print(os.getcwd()) # 还是当前目录D:gittest
    # 所以用os.system执行cd命令切换盘符的,只能一气呵成用 && 或者 ; 来拼接执行命令,不能分步执行
    os.system('cd ../代码/weebot_wxbot && pipenv install && start pipenv run python 666.py')# 在 cmd 命令前加入 start 可不阻塞当前程序执行
    # os.system('cd ../代码/weebot_wxbot ; pipenv install ; start pipenv run python 666.py')

    2.2 os.chdir切换盘符

    # 第二种os.chdir切换主进程盘符,执行其他文件
    base_path = os.getcwd() # 获取当前主进程基础目录
    os.chdir('../代码/weebot_wxbot_bieyang') # 这个可以改变当前主进程工作目录到指定的路径
    print(os.getcwd()) # D:代码weebot_wxbot,主进程目录已经变化
    
    os.system('pipenv install') # 默认阻塞当前程序执行依赖安装
    aa = os.system('start pipenv run python 666.py') # 在 cmd 命令前加入 start 可不阻塞当前程序执行
    # os.system('pipenv install && start pipenv run python 666.py') # 可以分开执行也可以这样
    
    os.chdir(base_path) # 更新并启动后从子进程的工作目录再次切回当前主进程基础目录
    
    
  • 相关阅读:
    [PyTorch]PyTorch中反卷积的用法
    [Pytorch]PyTorch Dataloader自定义数据读取
    [ACM]51nod 贪心专题
    上采样和PixelShuffle(转)
    反卷积(转置卷积)的理解
    [PyTorch]PyTorch中模型的参数初始化的几种方法(转)
    [OpenCV]OpenCV常用语法函数与坑点
    [PyTorch]PyTorch/python常用语法/常见坑点
    [Pytorch]PyTorch使用tensorboardX(转
    [Pytorch]Pytorch 保存模型与加载模型(转)
  • 原文地址:https://www.cnblogs.com/xp1315458571/p/15357350.html
Copyright © 2011-2022 走看看