py文件转换为so文件

将py文件编译为so文件

 

 

 

 利用上面代码生成so文件生成的文件不方便取放,名字也不一样

通过执行发现转换执行了下面三句

/usr/local/python3/bin/cython test.py
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/python3/include/python3.7m -c test.c -o test.o
gcc -pthread -shared test.o -o test.so

通过命令行执行也可以生成,那么开始编写一个shell脚本

复制代码
import datetime
import os

'''
/usr/local/python3/bin/cython test.py
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/python3/include/python3.7m -c test.c -o test.o
gcc -pthread -shared test.o -o test.so
'''

def func(path, save_file='build.sh'):
    path = path.replace('\\', '/')
    path = path.replace('\\', '/')
    with open(save_file, "w", encoding='utf-8') as fw:
        fw.write("#!/bin/bash" + "\n")
        basic_folder = os.path.split(path)[1]
        # print(path)
        now_time = datetime.datetime.now()
        encryp_path = f'encryp_so{now_time.strftime("%Y%m%d%H%M%S")}'
        # print(encryp_path)
        fw.write("\n")
        fw.write(f"mkdir {encryp_path}" + "\n")
        fw.write("\n")
        fw.write("\n")
        for root, dirs, files in os.walk(path):
            for file in files:
                # print(file)
                ftype = str(file).split('.')[-1]
                # print(ftype)
                if ftype == 'py':
                    if file != '__init__.py':
                        folder = os.path.split(root)[1]
                        if folder != 'migrations':
                            if root == path:
                                befor_path = ''
                            else:
                                # print(root)
                                length = len(path)
                                join_path = root[length+1:]
                                join_path = join_path.replace('\\', '/')
                                join_path = join_path.replace('\\', '/')
                                # print(join_path)
                                befor_path = f'{join_path}/'
                            final_file = befor_path+file
                            fw.write(f"/usr/local/python3/bin/cython {final_file}" + "\n")
        fw.write("\n")
        fw.write("\n")
        fw.write("\n")
        for root, dirs, files in os.walk(path):
            for file in files:
                # print(file)
                ftype = str(file).split('.')[-1]
                fname = str(file).split('.')[0]
                # print(ftype)
                if ftype == 'py':
                    if file != '__init__.py':
                        folder = os.path.split(root)[1]
                        if folder != 'migrations':
                            if root == path:
                                befor_path = ''
                            else:
                                # print(root)
                                length = len(path)
                                join_path = root[length + 1:]
                                join_path = join_path.replace('\\', '/')
                                join_path = join_path.replace('\\', '/')
                                # print(join_path)
                                befor_path = f'{join_path}/'
                            final_file = befor_path + fname
                            o_file = befor_path + fname

                            fw.write(f"gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/python3/include/python3.7m -c {final_file}.c -o {o_file}.o" + "\n")
            # print(root, dirs, files)

        fw.write("\n")
        fw.write("\n")
        fw.write("\n")
        for root, dirs, files in os.walk(path):
            for file in files:
                # print(file)
                ftype = str(file).split('.')[-1]
                fname = str(file).split('.')[0]
                # print(ftype)
                if ftype == 'py':
                    if file != '__init__.py':
                        folder = os.path.split(root)[1]
                        if folder != 'migrations':
                            if root == path:
                                befor_path = ''
                            else:
                                # print(root)
                                length = len(path)
                                join_path = root[length + 1:]
                                join_path = join_path.replace('\\', '/')
                                join_path = join_path.replace('\\', '/')
                                # print(join_path)
                                befor_path = f'{join_path}/'
                            final_file = befor_path + fname
                            o_file = befor_path + fname

                            fw.write(f"gcc -pthread -shared {final_file}.o -o {o_file}.so" + "\n")

        fw.write("\n")
        fw.write("\n")
        fw.write("\n")
        fw.write("find . -name '*.c' -delete" + "\n")
        fw.write("find . -name '*.o' -delete" + "\n")
        fw.write("\n")
        for root, dirs, files in os.walk(path):
            # print(dirs)
            length = len(path)
            join_path = root[length + 1:]
            join_path = join_path.replace('\\', '/')
            join_path = join_path.replace('\\', '/')
            # print(join_path, dirs)

            for dir in dirs:
                if '.git' in join_path or '.idea' in join_path:
                    # print(join_path)
                    continue
                if dir != '__pycache__' and '.git' not in dir and '.idea' not in dir:
                    if join_path:
                        new_path = join_path+f'/{dir}'
                    else:
                        new_path = dir
                    fw.write(f"mkdir {encryp_path}/{new_path}" + "\n")
        fw.write("\n")
        for root, dirs, files in os.walk(path):
            for file in files:
                # print(file)
                ftype = str(file).split('.')[-1]
                fname = str(file).split('.')[0]
                # print(ftype)
                if ftype == 'py':
                    folder = os.path.split(root)[1]
                    if folder != 'migrations':
                        if root == path:
                            befor_path = ''
                        else:
                            # print(root)
                            length = len(path)
                            join_path = root[length + 1:]
                            join_path = join_path.replace('\\', '/')
                            join_path = join_path.replace('\\', '/')
                            # print(join_path)
                            befor_path = f'{join_path}/'
                        final_file = befor_path + fname
                        o_file = befor_path + fname
                        if file != '__init__.py':

                            fw.write(f"mv {final_file}.so {encryp_path}/{o_file}.so" + "\n")
                        else:
                            final_file = befor_path + fname
                            o_file = befor_path + fname
                            fw.write(f"cp {final_file}.py {encryp_path}/{o_file}.py" + "\n")


def start(basic_path, folder_list,save_list):

    for i in range(len(folder_list)):
        path = os.path.join(basic_path, folder_list[i])
        func(path, save_list[i])


if __name__ == '__main__':
    # file_path = __file__
    # basic_path = os.path.split(file_path)[0]
    # folder_list = ['']
    # save_list = ['build222.sh']
    # start(basic_path, folder_list, save_list)
    # print(path)
    # print(os.path.join(basic_path, ''))

    basic_path = r'G:\work\debug\test_so'
    folder_list = ['aaa']
    save_list = ['build221.sh']
    start(basic_path, folder_list, save_list)
复制代码

 

通过代码生成一个shell脚本,再去执行这个脚本,达到生成一样目录结构的so文件目录

 

执行完后生成的sh文件

 

 

 

 

复制代码
#!/bin/bash

mkdir encryp_so20230309145220


/usr/local/python3/bin/cython te.py



gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/python3/include/python3.7m -c te.c -o te.o



gcc -pthread -shared te.o -o te.so



find . -name '*.c' -delete
find . -name '*.o' -delete

mkdir encryp_so20230309145220/bbb

mv te.so encryp_so20230309145220/te.so
cp __init__.py encryp_so20230309145220/__init__.py
复制代码

 

 

直接执行该文件即可得到想要的so文件

 

posted @   Wchime  阅读(382)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示