最近游戲項目在多個國家上線,每個國家都對應兩份兒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命令的例子就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

