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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
理解Python中的With语句
Mar 18 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Python比较2个时间大小的实现方法
Apr 10 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python是怎么被发明的
Jun 15 Python
Python爬虫简单运用爬取代理IP的实现
Dec 01 Python
python opencv将多个图放在一个窗口的实例详解
Feb 28 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 SQL Injection with MySQL
2011/02/27 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
linux中cd命令使用详解
2015/01/08 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
Javascript----文件操作
2007/01/18 Javascript
Three.js源码阅读笔记(光照部分)
2012/12/27 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
Vuex实现数据共享的方法
2019/12/20 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python将文本转换成图片输出的方法
2015/04/28 Python
用Python进行TCP网络编程的教程
2015/04/29 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
Python微医挂号网医生数据抓取
2019/01/24 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
《月迹》教学反思
2014/02/19 职场文书
幼儿园教学随笔感言
2014/02/23 职场文书
道路建设实施方案
2014/03/18 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
python for循环赋值问题
2021/06/03 Python