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 XML RPC服务器端和客户端实例
Nov 22 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
May 11 Python
python+opencv实现动态物体识别
Jan 09 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
对于Python深浅拷贝的理解
Jul 29 Python
对Django的restful用法详解(自带的增删改查)
Aug 28 Python
Python如何使用函数做字典的值
Nov 30 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
微信小程序 获取javascript 里的数据
2017/08/17 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
[01:16:28]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第二场 2月23日
2021/03/11 DOTA
Python IDLE入门简介
2017/12/08 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
python如何将图片转换素描画
2020/09/08 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
怒海潜将观后感
2015/06/11 职场文书
缅怀先烈主题班会
2015/08/14 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
四十九个javascript小知识实用技巧
2021/11/20 Javascript