批量將.py轉爲.pyc文件
一、什麼是pyc文件:
pyc是一種二進制文件,是由py文件經過編譯後,生成的文件,是一種byte code,py文件變成pyc文件後,加載的速度有所提高,而且pyc是一種跨平臺的字節碼,是由python的虛擬機來執行的,這個是類似於JAVA或者.NET的虛擬機的概念。pyc的內容,是跟python的版本相關的,不同版本編譯後的pyc文件是不同的,2.5編譯的pyc文件,2.4版本的python是無法執行的。
二、目的:
將.py文件轉化爲.pyc文件,從而實現代碼隱藏的需要,同時也增加了代碼文件讀取的速度
三、使用:
python提供了內置的類庫來實現把py文件編譯爲pyc文件,這個模塊就是 py_compile 模塊,轉化後的.pyc文件將在當前目錄的pycache文件夾下,使用非常簡單。
例如在windows環境下:
import py_compile
py_compile.compile(r'H:/game/test.py')
compile函數原型:
compile(file[, cfile[, dfile[, doraise]]])
file 表示需要編譯的py文件的路徑
cfile 表示編譯後的pyc文件名稱和路徑,默認爲直接在file文件名後加c 或者 o,o表示優化的字節碼
dfile 這個參數英文看不明白,請各位大大賜教。(鄙視下自己)原文:it is used as the name of the source file in error messages instead of file
doraise 可以是兩個值,True或者False,如果爲True,則會引發一個PyCompileError,否則如果編譯文件出錯,則會有一個錯誤,默認顯示在sys.stderr中,而不會引發異常
四、批量編譯方法及其代碼呈現(可批量編譯Django):
liunx版本
import os
import sys
import shutil
from py_compile import compile
if len(sys.argv) == 3 or len(sys.argv) == 4:
comd = sys.argv[1] #輸入的命令
path = sys.argv[2] #文件的地址
ver = sys.argv[3] # 要祛除的版本號
if os.path.exists(path) and os.path.isdir(path):
for parent,dirname,filename in os.walk(path):
for cfile in filename:
fullname = os.path.join(parent,cfile)
#編譯pyc文件
if comd == 'compile' and cfile[-3:] == '.py':
try:
if compile(fullname):
os.remove(fullname)
print("編譯成功,%s已刪除"%fullname)
else:
print(fullname,"編譯失敗,文件已保留/(ㄒoㄒ)/~~/(ㄒoㄒ)/~~/(ㄒoㄒ)/~~/(ㄒoㄒ)/~~")
except:
print("Can't compile file:%s" % fullname)
#移動pyc文件到原來py文件處
if comd=='move' and cfile[-4:] == '.pyc':
parent_list = parent.split("/")[:-1]
parent_up_path = ''
for i in range(len(parent_list)):
parent_up_path+=parent_list[i]+'/'
shutil.move(fullname,parent_up_path)
print('update the dir of file successfully')
#移除pyc文件中的版本號
if comd=='rmnum' and cfile[-4:] =='.pyc':
cfile_name = ''
cfile_list = cfile.split('.')
for i in range(len(cfile_list)):
if cfile_list[i]==ver:
continue
cfile_name+=cfile_list[i]
if i==len(cfile_list)-1:
continue
cfile_name+='.'
print("結果:",shutil.move(fullname,os.path.join(parent,cfile_name)))
else:
print("Not an directory or Direcotry doesn't exist!")
else:
print("Usage:")
print("\tpython3 create_pyc.py compile PATH\t\t#創建pyc並刪除py文件")
print("\tpython3 create_pyc.py move PATH\t\t#將.pyc文件移動到原py文件目錄下")
print("\tpython3 create_pyc.py rmnum PATH VER_NUM \t\t#根據文件.pyc中所帶的版本標識去掉.pyc文件名中的版本號")
使用說明
1.備份源碼
2.生成.pyc文件,並刪除源文件
說明:使用此命令後會將生成的.pyc文件放到與.py同級pycache目錄下,如果生成過程中沒有拋出錯誤,會刪除原.py文件,如果拋出錯誤會保留.py文件,不會在pycache目錄下生成.pyc文件,根據命令執行的過程,找出錯誤發生的位置並解決。
python3 create_pyc.py compile /home/wp/PyWork/mcenter
3.將.pyc文件移動到原py文件目錄下
說明:爲了保證目錄文件結構的正確性,我們需要把生成的pyc文件 從pycache目錄中移動到原來py文件的位置
python3 create_pyc.py move /home/wp/PyWork/mcenter
4.根據文件.pyc中所帶的版本標識去掉.pyc文件名中的版本號
說明:compile方法會在pyc文件名字基礎上自動加上版本標識, 這裏用rmnum方法去掉
python3 create_pyc.py rmnum /home/wp/PyWork/mcenter cpython-36