首页 > 其他分享 >cython,将py文件编译成pyd/so文件

cython,将py文件编译成pyd/so文件

时间:2023-12-26 14:11:26浏览次数:38  
标签:files 文件 cython 编译成 py file input path pyd

在windows下使用cythonize可以将py文件编译成pyd,这样就完成了初步的python代码加密工作
使用前需要先安装Cython pip install Cython
然后对py文件执行命令cythonize -i -3 --directive always_allow_keywords=true xxx.py
这里有一个要注意的点:

  • --directive always_allow_keywords=true. 这一个参数是强制生成keyword,因为有的人在写python文件时,会写成:
    def func(input):
       // do somthing
       return True
    
    res = func(input=input) # 注意这里,input=input,相当于需要一个keyword
    
    但是cython默认不会为一个参数的函数生成keyword,因此当出现上面这种情况时,就会出现py可以运行pyd不可以运行的情况。见always_allow_keywords,文档里说关闭always_allow_keywords会slightly faster,但是都用python了这点性能总感觉大差不差的,毕竟只是针对只有一个入参的函数才有用。

下面是一个脚本,用于把目录下的所有py文件转换为pyd

import os
import sys
import subprocess
from pathlib import Path

def compile_to_pyd(src_path: str, auto_delete: bool):
    if (os.path.isfile(src_path)):
        print("input file")
        py_files = []
        if (src_path.endswith(".py")):
            py_files.append(src_path)
    else:
        print("input dir")
        # 获取目录中的所有.py文件
        py_files_Path = list(Path(src_path).rglob('*.py'))
        py_files = [str(file.absolute()) for file in py_files_Path]
    
    if len(py_files) == 0:
        print("no py files...")
        return
        
    print(f"building {len(py_files)} py files...")
    # 使用Cython编译为.pyd文件
    files_str = " ".join(py_files)
    # --directive always_allow_keywords=true 是为了防止有人写 res = fun(a = a) 这种情况
    # cython默认对于单参数不生成keyword,因此要强制开启
    # https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html
    compile_command = f"cythonize -i -3 --directive always_allow_keywords=true {files_str}"
    print(compile_command)
    subprocess.run(compile_command, shell=True, check=True)
    
    if auto_delete:
        # 删除生成的 .py 和 .c 文件
        for py_file in py_files:
            c_file = py_file[:-2] + "c"
            if os.path.exists(c_file):
                os.remove(c_file)
            if os.path.exists(py_file):
                os.remove(py_file)
    

if __name__ == "__main__":

    if len(sys.argv) < 2:
        print("Usage: python compile_to_pyd.py <directory>")
        sys.exit(1)

    dir_name = sys.argv[1]
    auto_delete = "--auto-delete" in sys.argv
    compile_to_pyd(dir_name, auto_delete)

标签:files,文件,cython,编译成,py,file,input,path,pyd
From: https://www.cnblogs.com/miyanyan/p/17928011.html

相关文章

  • 写一个MATLAB脚本删除一个.m文件的所有注释,输出到一个新.m文件,文件名加上_modified后
    请注意,这个脚本仅处理了最简单的情况,真正的Matlab代码可能包含更复杂的结构,如多行字符串、嵌套的字符串、转义字符等,处理这些情况可能需要更复杂的逻辑。clearall;closeall;clc;%Specifytheinput.mfilenameinputFileName='originalScript.m';outputFileName=[inpu......
  • LiveGBS流媒体平台GB/T28181常见问题-配置国标流媒体服务日志文件个数及记录时长配置l
    LiveGBS流媒体平台GB/T28181常见问题-如何配置国标流媒体服务日志文件个数及记录时长1、日志文件2、配置日志文件个数及记录时间3、配置日志文件路径4、相关问题4.1、如何关闭信令日志?5、搭建GB28181视频直播平台1、日志文件部署LiveGBS后,LiveCMS和LiveSMS的解压目录下都个l......
  • VS2019,无法启动程序xxx.exe,系统找不到指定的文件,重新生成解决方案报错
     调试程序报错如图一、尝试重新生成解决方案二、如果生成解决方案也报错,重新安装.netSDK本人所用为VS2019,.net5,到官网下载.net5的SDK重新安装后,恢复正常,重新生成成功,启动调试成功。.net各版本下载地址:https://dotnet.microsoft.com/en-us/download/dotnet.net5下载地址:h......
  • JavaWeb - Day11 - 案例 - 员工管理、文件上传、修改员工、配置文件
    01.案例-员工管理-新增员工前面我们已经实现了员工信息的条件分页查询以及删除操作。关于员工管理的功能,还有两个需要实现:新增员工修改员工首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在"新增员工"中,需要添加头像,而头像需要用到"文件上传"技......
  • HTML5 文件上传的2种方式
    以前上传文件需要提交Form表单。HTML5方式上传文件,可以通过使用FormData类模拟Form表单提交,从而实现无刷新上传文件。 假设有一个文件选择框<inputtype="file"name="pic"id="pic"accept="image/gif"/>有下面2种方式上传文件:1、XMLHttpRequest(有进度事件)varfiles=d......
  • Linux配置NFS文件共享
    一、NFS简介NFS是NetworkFileSystem的缩写,是一种分布式文件系统协议,用于在计算机网络上共享文件。它允许客户端计算机通过网络远程访问和处理远程服务器上的文件和目录。NFS最初由SunMicrosystems开发并在1984年发布,被设计为可在不同操作系统和硬件平台之间共享文件。它基于客户......
  • 宝塔文件分析
    宝塔文件分析 宝塔登录密码加密方式此处分析的实验环境为宝塔版本:免费版7.6.0tools.py调用set_panel_pwd()函数设置密码result=sql.table('users').where('id=?',(1,)).setField('password',public.password_salt(public.md5(password),uid=1))此处看到使用了public.......
  • 安装go-icp_cython-master报错error C2371: “int8_t”: 重定义;不同的基类型
    库链接:aalavandhaann/go-icp_cython:用于全局最优3D点集配准的Go-ICP(github.com)解决方法:找到matrix.hpp文件,用记事本打开,在__int8之前加入signed,然后保存。 ......
  • pdf文件修改
    packagemainimport( "fmt" docx"github.com/lukasjarosch/go-docx")funcmain(){ replaceMap:=docx.PlaceholderMap{ "wilson1":"wilson", "wilson":"4205234243", "......
  • 解决adb传文件中文名问题
    @echooffsetlocalenabledelayedexpansionREM路径后面记得不要加斜杠set目标路径=/sdcard/01tmpecho目标路径:%目标路径%echo=set有连接=Falsefor/F"tokens=*skip=1"%%iin('adbdevices')doset有连接=Truesetn=10setstr=abcdefghijklmnopqrstuvwxyz012......