python3调用windows dos命令的例子


Posted in Python onAugust 14, 2019

最近游戏项目在多个国家上线,每个国家都对应两份儿svn目录(一份是本地策划目录,一份是线上目录)。于是乎维护变得很烦躁。需要先更新本地策划svn目录,然后把更新的文件拷贝到对应的线上目录,然后提交线上svn目录,然后维护服务器。多个国家就要重复多次类似的更新,拷贝,提交的操作,还要格外注意不能手抖,出现少复制的错误。这种重复的操作很适合写一个工具来完成。

于是考虑使用python来写这个工具,最基本的操作就是使用python调用svn命令。因为windows安装svn后是没有svn命令行的,所以首先需要下载Apache-Subversion,这是svn命令行工具,解压后设置环境变量。

python调用dos命令,使用下面的方法:

os.popen(command)

此方法会阻塞,直到执行完成,当然也会返回执行的结果。如果你使用chcp设置过windows命令行的代码页,比如曾经使用:chcp 65001。那么在执行python程序的时候就可能产生gbk编码的错误,解决此问题需要重新使用:chcp 936来设置命令行代码页就OK了。

完整代码如下:

import os
import shutil

'''

循环执行每个一个资源目录,每个目录的执行过程如下:

  1:更新线上目录
  2:更新本地目录
  3:把本地目录的修改同步到线上目录
  4:提交线上目录

'''

#本地svn目录
local_r_en = "server/trunk/resource"
local_r_ar = "server/resource_ar"
local_r_fr = "server/resource_fr"
local_r_ge = "server/resource_ge"
local_r_ita = "server/resource_ita"
local_r_ru = "server/resource_ru"
local_r_sp = "server/resource_sp"
local_r_tr = "server/resource_tr"
local_r_wp_en = "server/resource_wp"

#线上svn目录
online_r_en = "serverOL/resource_en"
online_r_ar = "serverOL/resource_ar"
online_r_fr = "serverOL/resource_fr"
online_r_ge = "serverOL/resource_ge"
online_r_ita = "serverOL/resource_ita"
online_r_ru = "serverOL/resource_ru"
online_r_sp = "serverOL/resource_sp"
online_r_tk = "serverOL/resource_tk"
online_r_wp_en = "serverOL/resource_wp"


#不需要更新的服务器,请把下面对应的资源目录注释掉
recource_dict = {}
recource_dict[local_r_en] = online_r_en       #美国
# recource_dict[local_r_ar] = online_r_ar      #阿拉伯
# recource_dict[local_r_fr] = online_r_fr      #法国
# recource_dict[local_r_ge] = online_r_ge      #德国
# recource_dict[local_r_ita] = online_r_ita     #意大利
# recource_dict[local_r_ru] = online_r_ru      #俄罗斯
# recource_dict[local_r_sp] = online_r_sp      #西班牙
# recource_dict[local_r_tr] = online_r_tk      #土耳其
# recource_dict[local_r_wp] = online_r_wp    #wp



'''
复制文件到目的文件
'''
def copyFile(src,dst):
  #目的目录
  dst_dir = dst[:dst.rfind("/")]

  #如果目录不存在则创建目录,如果文件存在则删除
  if not os.path.exists(dst_dir):
    os.makedirs(dst_dir)
  elif os.path.exists(dst):
    os.remove(dst)

  #复制新文件
  shutil.copyfile(src, dst)
#end method copyFile

'''
删除文件
'''
def removeFile(dst):
  if os.path.exists(dst):
    os.remove(dst)
#end method removeFile


'''
打印命令结果
'''
def svnResult(result):
  for line in result:
    line = line.replace("\n","")
    print(line)
#end method svnResult


'''
svn命令执行
'''
def svnSimpleExecute(command):
  print(">>",command)
  result = os.popen(command).readlines()
  svnResult(result)
#end method svnExecute


'''
svn提交目录
'''
def svnCommit(dst):
  command = "svn status "+dst
  print(">>",command)
  command_result = os.popen(command).readlines()
  if len(command_result) <= 2:
    print("没有需要添加,删除和提交的内容")
    return

  for line in command_result:
    #去掉换行符
    line = line.replace("\n","")
    print(line)
    line = line.replace(" ","")
    firstChar = line[0:1]
    filePath = line[1:]
    #命令
    command_add = "svn add "+filePath
    command_ci = "svn commit -m \"svn tools commit,更新维护。\" "+filePath
    command_rm = "svn delete "+filePath

    if firstChar == "?":#ADD命令
      svnSimpleExecute(command_add)
      svnSimpleExecute(command_ci)
    elif firstChar in "ADM":#COMMIT 命令
      svnSimpleExecute(command_ci)
    elif firstChar == "!": #删除命令
      svnSimpleExecute(command_rm)
      svnSimpleExecute(command_ci)
    else:
      print("Unkonw.......",line)
#end method svnCommit


'''
解析获得对应的本地文件和线上文件路径
'''
def parseLine(line,local_dir,online_dir):
  line = line.replace("'","")
  line = line.replace("\\","/")
  line = line.replace(local_dir,"")
  pos = line.find("/")
  return local_dir + line[pos:],online_dir + line[pos:]
#end method parseLine


#循环资源目录
for local_dir in recource_dict:
  online_dir = recource_dict[local_dir]

  #更新线上资源
  command_online = "svn up " + online_dir
  svnSimpleExecute(command_online)

  #更新本地资源
  command_local = "svn up " + local_dir
  print(">>",command_local)

  lines = os.popen(command_local).readlines()
  if len(lines) <= 2:
    print("没有更新内容")
    continue

  #去掉头和尾部内容
  lines.pop(-1)
  lines.pop(0)

  for line in lines:
    #去掉换行符
    line = line.replace("\n","")
    print(line)
    #解析文件对应目录
    localFilePath,onlineFilePath = parseLine(line,local_dir,online_dir)

    if line.startswith("Restored") or line.startswith("A") or line.startswith("U"):
      print("复制文件:",localFilePath,"到",onlineFilePath) 
      copyFile(localFilePath,onlineFilePath)
    elif line.startswith("D"):
      #删除
      print("删除文件:",onlineFilePath)
      removeFile(onlineFilePath)

  #提交线上目录
  svnCommit(online_dir)

这下维护起来就简单多了,世界瞬间清净了。

以上这篇python3调用windows dos命令的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python操作列表之List.insert()方法的使用
May 20 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
浅谈python中的占位符
Nov 09 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
python中subprocess批量执行linux命令
Apr 27 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
Python从函数参数类型引出元组实例分析
May 28 Python
记录Python脚本的运行日志的方法
Jun 05 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
Python将字典转换为XML的方法
Aug 01 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 #Python
用Python调用win命令行提高工作效率的实例
Aug 14 #Python
python基础教程之while循环
Aug 14 #Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 #Python
Python学习笔记之Break和Continue用法分析
Aug 14 #Python
Python学习笔记之While循环用法分析
Aug 14 #Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 #Python
You might like
PHP获取服务器端信息的方法
2014/11/28 PHP
php实现倒计时效果
2015/12/19 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
JavaScript方法和技巧大全
2006/12/27 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
javascript常用正则表达式汇总
2015/07/31 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
浅谈Python 对象内存占用
2016/07/15 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
python中使用.py配置文件的方法详解
2020/11/23 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
教育学专业毕业生的自我评价
2013/11/21 职场文书
房产协议书范本2014
2014/09/30 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
群众路线专项整治方案
2014/10/27 职场文书
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL