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列表生成器的循环技巧分享
Mar 06 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
Python 查看文件的读写权限方法
Jan 23 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
python检测IP地址变化并触发事件
Dec 26 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 Python
在python中,使用scatter绘制散点图的实例
Jul 03 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
10张动图学会python循环与递归问题
Feb 06 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 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
Python实现批量下载图片的方法
2015/07/08 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
django 微信网页授权登陆的实现
2019/07/30 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
如何学习Python time模块
2020/06/03 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
在keras里实现自定义上采样层
2020/06/28 Python
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
德国高性价比网上药店:medpex
2017/07/09 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
2014年财政所工作总结
2014/11/22 职场文书
英文商务邀请函范文
2015/01/31 职场文书
个人年底工作总结
2015/03/10 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
详解MySQL中的主键与事务
2021/05/27 MySQL