[Python] 合併工作空間程式碼 (含打包成EXE程式)
阿新 • • 發佈:2018-11-07
(我轉載我自己的 : ) )
為什麼要做這個指令碼
最近這幾天在外面出差,因為之前工作的SVN是內網環境的,所以在外面(成都)無法通過SVN合併程式碼。
沒辦法,只能手動合併了。我們通過在本地電腦上,將修改的程式碼打包,然後通過微信發給其他同事。
But,問題來了,Java的程式碼需要放到對應的包下面的,如果通過微信傳送過去,那麼做合併的時候就要知道每一個Java檔案的包路徑。這樣太麻煩了,SO,我就用Python來解決這個問題。
優秀的Coder,善於用計算機偷懶!
程式流程 (Python風格的流程哦)
- 讀取配置檔案 (因為要給其他同事用,所以修改配置檔案必修改程式碼要方便)
- 遍歷原始碼路徑下的所有Java檔案:
- 獲取當前遍歷的Java檔案的完整路徑
- 獲取當前遍歷的Java檔案在目標路徑下的路徑(通過包名哦)
- 用原始檔替換目標檔案
配置資訊
我們採用JSON格式儲存資料,這樣做雖然書寫起來麻煩,但是讀取方便(因為可以直接使用JSON包讀取)
記得把註釋(#號開頭的部分)去掉
{
"target": {
"path": "E:\\Code\\Path" # 目標檔案路徑,即被覆蓋的位置,舊的程式碼的路徑
},
"source": {
"path" : ".\\source" # 原始檔路徑,即新的程式碼的路徑
}
}
程式碼
程式碼最好在Windows下使用,而且要Python3.x的環境,且不需要第三方包庫
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, json
# 獲取配置資訊函式
def getConfig():
with open('main.conf', 'r', encoding='gbk') as f:
return json.load(f)
# 讀取配置資訊
CONFIG = getConfig()
# 獲取目標路徑函式
def getTargetPath(sfile):
# 這裡的encoding指定GBK是因為我們的Java程式碼的字元編碼是GBK
with open(sfile, 'r', encoding='gbk') as f:
# 讀取檔案內容
lines = f.readlines()
# 遍歷每一行內容
for line in lines:
# 去除兩端的空白符並將字母轉換為小寫
line = line.strip().lower()
# 除了以'package'開頭的內容,其他的全部跳過
# 因為Java中package後面的是該類的包名,所以讀取包名即可知道這篇程式碼的目標路徑
if line.startswith('package'):
# 擷取包名部分,並去除兩端的空白符
packageName = line[7:-1].strip()
# 拼接出完整的目標路徑
return os.path.join(
# 讀取配置資訊中的目標檔案的根路徑
CONFIG['target']['path'],
# 包名轉換為路徑
packageName.replace('.', os.sep),
# 擷取檔名
os.path.split(sfile)[-1]
)
# 程式主入口
def main():
# 遍歷全部的原始檔
for path in os.listdir(CONFIG['source']['path']):
# 如果是Java檔案,則執行替換的流程
if os.path.splitext(path)[-1] == '.java':
# 獲取當前遍歷的Java檔案的完整路徑
source = os.path.join(CONFIG['source']['path'], path)
# 獲取當前遍歷的Java檔案的目標路徑
target = getTargetPath(source)
# 替換檔案
os.replace(source, target)
# 執行主函式
main()
# 不打包的話,可以解開下面的註釋
# 這樣,當報出異常時,就不會閃退了
# if __name__ == '__main__':
# os.system('pause')
將程式碼打包成EXE
這裡是通過PyInstaller 3.4打包的,其他版本不清楚是否適用,下面是打包的命令:
pyinstaller -F MergeCode.py -n MergeCode --icon="icon.ico"
命令解釋:
-F 指定程式碼的主入口,這裡就只有一個Python原始碼檔案,所以直接指定這個程式碼檔案即可
-n 指定打包後的EXE程式的名稱
–icon 指定圖示的路徑