最近游戲項目在多個國家上線,每個國家都對應兩份兒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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
