Django 批量將.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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章