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基础教程之循环介绍
Aug 29 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
学习Python列表的基础知识汇总
Mar 10 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python同时处理多个异常的方法
Jul 28 Python
Django项目创建及管理实现流程详解
Oct 13 Python
Python绘制数码晶体管日期
Feb 19 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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 图片上传类代码
2009/07/17 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP Cookie学习笔记
2016/08/23 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
extjs fckeditor集成代码
2009/05/10 Javascript
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
学习ExtJS TextField常用方法
2009/10/07 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python字符串详细介绍
2015/05/09 Python
Django框架模板用法入门教程
2019/11/04 Python
python如何使用腾讯云发送短信
2020/09/17 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
书法培训心得体会
2014/01/05 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
国旗下的演讲稿
2014/05/08 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
七年级上册生物的课件
2019/08/07 职场文书