py文件批量转pyc并编译为pyd方法

最近研究了下py转pyc、pyd的问题,现分享一些知识碎片:

py转pyc

单个py文件转为pyc文件

在命令行中输入如下命令:

python -m py_compile hello.py

py批量转pyc

compileall.compile_dir(path, force=True)为path目录下的py文件产生pyc文件,force=True更新所有的pyc文件。

使用compileall得到pyc文件后。

1、将__pycache__文件夹下的内容粘贴到和__pycache__文件同目录下。

2、将pyc文件名改为与py文件相同的名字。如:app.cpython-37.pyc–》app.pyc

3、删除py文件

import os, shutil

import compileall



def copy_to_up(path):

    for f in os.listdir(path):

        if f == '__pycache__':

            for f_main in os.listdir(os.path.join(path, f)):

                path_src = os.path.join(path, f)

                shutil.copy(os.path.join(path_src,f_main),path)



def rename_file(path):

    for f in os.listdir(path):

        if f.endswith('.pyc'):

            f_new = f.replace('.cpython-37','')

            os.rename(os.path.join(path, f), os.path.join(path, f_new))



def copy_rename(f, path):

    # 如果是__pycache__ 文件夹 将其中的文件移至上一层

    if f == '__pycache__':

        copy_to_up(path)

    #当前层为.pyc文件重命名

        rename_file(path)

    for pyf in os.listdir(path):

        if pyf.endswith('.py') and not os.path.isdir(os.path.join(path, pyf)):

            os.remove(os.path.join(path, pyf))

  

def py_to_pyc(path):

    for f in os.listdir(path):

        copy_rename(f, path)

        if f != 'env' and f!='.vscode' and os.path.isdir(os.path.join(path, f)):

            path_d = os.path.join(path, f)

            print(path_d)

            for f_d in os.listdir(path_d):  

                copy_rename(f_d, path_d)

                if os.path.isdir(os.path.join(path_d, f_d)):

                    path_d_d = os.path.join(path_d, f_d)

                    print(path_d_d)

                    for f_d_d in os.listdir(path_d_d):

                        copy_rename(f_d_d, path_d_d)



if __name__ == '__main__':

    path = r'C:\Users\Administrator\Desktop\mine'

    compileall.compile_dir(path, force=True)

    py_to_pyc(path)

py转pyd

使用easycython

https://pypi.org/project/easycython/

pyd不能直接python run,需要配合py或pyc引用它。