python3调用windows dos命令的例子
作者:褚金辉 发布时间:2021-11-10 06:36:44
标签:python3,windows,dos
最近游戏项目在多个国家上线,每个国家都对应两份儿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)
这下维护起来就简单多了,世界瞬间清净了。
来源:https://blog.csdn.net/maosijunzi/article/details/79220036


猜你喜欢
- 前言登录跳转:不同的用户在登录成功之后跳转到不同的网页当中例如:网站管理员登录成功后跳转到网站后台,vip用户登录成功后跳转到vip页面准备
- 本文实例讲述了Python使用minidom读写xml的方法。分享给大家供大家参考。具体分析如下:一 python提供的xml支持2种工业标
- 1.当前时间戳转换为指定格式的日期# -*- coding: utf-8 -*-# @Time : 2019/5/31 10:5
- 问题产生描述使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理。出问题的代码# 启用子进程执
- 哈希数据类型的创建与数据的添加 - hmset利用 “redis-py” 模块实现 &ldq
- 本文实例为大家分享了Vue实现web分页组件的具体代码,供大家参考,具体内容如下效果演示源代码<!DOCTYPE html>&l
- 在CSS中我们会经常要用到“清除浮动”Clear,比较典型的就是clear:both;CSS手册上是这样说明的:该属性的值指出了不允许有浮动
- 我见朋友可以把数据库的记录显示到列表框里去,挺实用,也想做一个。怎么做啊?这简单,代码和说明如下:dblist.asp<html>
- 目录1.需求2.代码实现总结1.需求发现项目本地所有带别名的URL,组成一个有序字典,方便后续调用;定向排除部分URL,如Django自带的
- 前言electron+vuecli3 实现设置打印机,静默打印小票功能网上相关的资料比较少,这里给大家分享一下,希望大家可以少踩一些坑git
- 表单介绍说到表单,在HTML中表单的创建时通过<form>标签实现的,在<form>标签内部,字段通过使用<i
- 方法一:定义一个函数,参数为所要生成随机字符串的长度。通过random.randint(a, b)方法得到随机数字,具体函数如下:def g
- 目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情
- 一、Tkinter的介绍和简单教程Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建
- 我的操作系统为centos6.51 首先选择django要使用什么数据库。django1.10默认数据库为sqlite3,本人想
- 服务器之间的http数据传输直接使用python内置的http服务:python -m SimpleHTTPServer 8000此时,输入
- 本文实例讲述了JavaScript通过改变文字透明度实现的文字闪烁效果。分享给大家供大家参考,具体如下:运行效果图如下:完整实例代码如下:&
- Python编程语言的优点非常多,它的编程特色主要体现在可扩充性方面。那么,在接下来的这篇文章中,我们将会为大家详细介绍一下有关Python
- 背景前几天在MySql上做分页时,看到有博文说使用 limit 0,10 方式分页会有丢数据问题,有人又说不会,于是想自己测试一下。测试时没
- 之前在osc看到一个文章讨论Get和Post的不同, 有人说不能用Get来上传文件。这就是用Get上传文件的例子,client用来发Get请