最近研究了下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引用它。

文章目录