python3调用windows dos命令的例子

作者:褚金辉 时间:2021-11-10 06:36:44 

最近游戏项目在多个国家上线,每个国家都对应两份儿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

标签:python3,windows,dos
0
投稿

猜你喜欢

  • 像表格一样用DIV+CSS给网页布局

    2008-10-18 15:45:00
  • python搜索包的路径的实现方法

    2021-01-18 01:27:44
  • WML初级教程之从实际应用中了解WML

    2008-09-04 11:24:00
  • Python学习之字符串常用方法总结

    2021-12-19 02:19:46
  • JavaScript 在各个浏览器中执行的耐性

    2009-02-06 15:26:00
  • javascript弹出窗口总结

    2009-08-21 12:40:00
  • 详解使用Visual Studio Code对Node.js进行断点调试

    2023-07-01 07:32:34
  • text-overflow实现标题省略号功能

    2009-05-19 12:13:00
  • asp如何终止浏览器的 CAHCE 页面?

    2010-07-07 12:25:00
  • DIV+CSS设计时容易犯的一些错误

    2007-11-13 12:42:00
  • JS删除数组里的某个元素方法

    2023-07-14 22:45:47
  • Dreamweaver4探谜系列(2)

    2010-05-13 12:08:00
  • Python pyecharts数据可视化实例详解

    2023-06-28 01:35:30
  • 如何改良你的CSS代码编写结构

    2008-09-29 16:03:00
  • MYSQL教程:检查数据表和修复数据表

    2009-03-11 15:24:00
  • 24式加速你的Python(小结)

    2023-09-25 10:25:24
  • asp 实现当有新信息时播放语音提示的效果

    2011-03-31 11:00:00
  • 社会化音乐:在夹缝中生出花来

    2009-08-24 12:37:00
  • FireScope-面向Web开发者和设计者的参考手册

    2009-03-22 15:35:00
  • python+Word2Vec实现中文聊天机器人的示例代码

    2023-08-04 13:11:29
  • asp之家 网络编程 m.aspxhome.com