【编程技巧】py文件批量编译,py批量转pyd,PyCharm设置py转pyd功能

【编程技巧】py文件批量编译,py批量转pyd,PyCharm设置py转pyd功能

python文件*.py都是明文,很难对代码进行加密。而python -m py_compile xxx.py的编译操作只能编译成pyc,pyc是很容易反编译的。
如果想彻底编译成二进制文件,必须用到Cython编译成pyd二进制文件。
但是使用Cython处理比较麻烦,要编写setup.py等很多设置。

本文的代码可以自动对单个py文件、目录中的所有文件(包含子目录里的py)进行自动编译,一键操作,非常便捷。还可以在集成环境PyCharm中进行一键操作。

一、运行代码
话不多说,先上代码。
参数说明请详细看注释,注释写的很全面。
注意首先Python环境要先安装cython模块:

pip install cython

如下是主代码,文件名:py2pyd.py

"""
Python批量编译程序
命令行参数说明:
all:对目录及子目录下的所有py文件进行编译
one:对单个py文件进行编译
del:编译完删除py文件。此操作无法恢复、慎用!!!
nodel:编译完不删除py文件
例子:
python py2pyd.py all del D:\PYTHON\toPYD\test
python py2pyd.py one nodel D:\PYTHON\toPYD\test\mycode.py
"""
import os, shutil, time, sys, glob
try: from setuptools import setup	# 检测是否安装了cython
except: print("\n请先安装cython模块:pip install cython\n"); sys.exit()

def py2pyd(path):
    folder_path = os.path.dirname(path)  # 文件夹路径
    file_path = os.path.split(path)[1]  # 不带路径的文件名
    os.chdir(folder_path)
    with open('setup.py', 'w') as f:    # 自动生成单独的setup.py文件
        f.write('from setuptools import setup\n')
        f.write('from Cython.Build import cythonize\n')
        f.write('setup(\n')
        f.write("name='test',\n")
        f.write("ext_modules=cythonize('%s')\n" % file_path)
        f.write(")\n")
    os.system('python setup.py build_ext --inplace')    #py编译开始

    filename = file_path.split('.py')[0]    #文件名
    time.sleep(2)
    pyd_name = '%s\\%s.pyd' % (folder_path, filename)   #pyd文件名
    if os.path.exists(pyd_name): os.remove(pyd_name)    #删除老的pyd

    amd64_pyd = glob.glob(filename + "*.pyd")   #获取pyd文件的全名,类似***.cp38-win_amd64.pyd
    print("生成了PYD:"+ amd64_pyd[0])

    # os.rename('%s\\%s.%s-win_%s.pyd' % (folder_path, filename, cpxx, amdxx), pyd_name)
    os.rename(amd64_pyd[0], pyd_name)  #改名字,删除多余的cp38-win_amd64.等
    os.remove('%s.c' % filename)    # 删除临时文件
    build_folder_path = os.path.join(folder_path, 'build')
    shutil.rmtree(build_folder_path)    # 删除掉生成的build文件夹
    os.remove('setup.py')   # 删除掉生成的setup.py
    if del_py == 'del':   # 删除py源文件,无法恢复,慎用!
        os.remove(file_path)

def get_all_file(path): # 遍历此目录下的所有py文件,包含子目录里的py
    for root, dirs, files in os.walk(path):
        for name in files:
            if name.endswith(".py"):
                file_path = os.path.join(root, name)
                py2pyd(file_path)

if len(sys.argv) <= 3:  # 判断命令行参数是否合法
    print("\n命令行参数错误...\n"); sys.exit()

one_all, del_py, paths = sys.argv[1:4]  # 获取命令行参数

if one_all == 'one': py2pyd(paths)
else: get_all_file(paths)

批处理测试文件:

::Python批量编译程序
::命令行参数说明:
::all:对目录及子目录下的所有py文件进行编译
::one:对单个py文件进行编译
::del:编译完删除py文件。此操作无法恢复、慎用!!!
::nodel:编译完不删除py文件
::例子:
::python py2pyd.py all del D:\PYTHON\toPYD\test
::python py2pyd.py one nodel D:\PYTHON\toPYD\test\mycode.py

python py2pyd.py all del D:\PYTHON\toPYD\test
python py2pyd.py one nodel D:\PYTHON\toPYD\test\ianx6.py
pause

二、PyCharm的自动设置
在CMD里用命令行运行py2pyd,可能比较麻烦。如果可以在PyCharm集成环境里直接编译那就太好了。如下设置可以实现。

依次点击:PyCharm->文件->设置->工具->外部工具,如下图:

在这里插入图片描述

点击“+”,进入编辑窗口,如下:
在这里插入图片描述
按如上进行设置,
实参:D:\PYTHON\toPYD\py2pyd.py one nodel xxxxx
路径:D:\PYTHON\toPYD\根据你自己的位置更改一下。
工作目录:xxxxx

【用法 】
在PyCharm左侧栏里的py文件上点击右键,菜单里的:外部工具->py2py(单个文件)

同样如果对目录里(包含子目录)的所有py文件进行批量处理,则设置如下:
如果你想编译后把py文件删除,只保留pyd文件,把nodel改成del即可,慎用!删除后不可恢复,回收站也没有的啊!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42398606/article/details/128242833
今日推荐