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