将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文件

py文件转换为so文件的更多相关文章

  1. python之模块py_compile用法(将py文件转换为pyc文件)

    # -*- coding: cp936 -*- #python 27 #xiaodeng #python之模块py_compile用法(将py文件转换为pyc文件):二进制文件,是由py文件经过编译后 ...

  2. TensorFlow的checkpoint文件转换为pb文件

    由于项目需要,需要将TensorFlow保存的模型从ckpt文件转换为pb文件. import os from tensorflow.python import pywrap_tensorflow f ...

  3. 使用VirtualBox把IMG文件转换为VDI文件

    使用VirtualBox把IMG文件转换为VDI文件 首先确保已安装VirtualBox. 需要使用的命令: 语法:$ VBoxManage convertdd input.img output.vd ...

  4. APNS .p12文件转换为 .pem文件

    1:先用mac的钥匙串工具,把APN的推送证书转换为 .p12文件: 2:在mac的终端下 把.p12文件转换为 .pem文件 openssl pkcs12 -in apns-dev-cert.p12 ...

  5. Python如何实现doc文件转换为docx文件?

    Python如何实现doc文件转换为docx文件? 在开发过程中遇到一个关于读写doc和docx的问题: 一个文件夹中有两种文件, 一种为doc结尾, 一种为docx结尾, 需要将这些文件全部重命名. ...

  6. GIF文件转换为头文件工具

    目的: GIF文件转为头文件 举例: 用UE打开GIF文件,如下图所示:图1 test.gif文件将上面文件内容转化为头文件,放到一个数组里面,内容如下:图2 test.h文件 思路: 从上面可知,将 ...

  7. bat文件转换为exe文件

    批处理文件转换为exe文件(简单的处理文件),点击下载 使用超简单的了,不多说.

  8. 实战FFmpeg--iOS平台使用FFmpeg将视频文件转换为YUV文件

    做播放器的开发这里面涉及的东西太多,我只能一步步往前走,慢慢深入.播放器播放视频采用的是渲染yuv文件.首先,要知道yuv文件是怎么转换得来的,其次,要知道怎么把视频文件保存为yuv文件.雷神的文章1 ...

  9. php如何将base64数据流文件转换为图片文件?

    2017-03-07 在开发中,自己遇到一个前端在上传图片的时候,使用的base64数据流文件显示的图片. 也就是说 <img src="data:image/jpg;base64,& ...

  10. openoffice启动服务并将office文件转换为pdf文件

    1.首先下载最新版的openoffice工具,安装完成之后安装服务,, win+r打开命令提示符 输入cmd,cd C:\Program Files (x86)\OpenOffice 4\progra ...

随机推荐

  1. spring-security-oauth2使用遇到的坑

    异常信息为 2021-08-22 14:24:11.086 WARN 17812 --- [ main] ConfigServletWebServerApplicationContext : Exce ...

  2. getElementsByClassName()获取不到值

    在这种方式下,虽然使用了getElementsByClassName方法,但是并不能获得到值.从执行顺序上来说,在HTML还没有执行的时候JS就已经开始执行了,所以获得的值不能够获得到.因此,如果遇到 ...

  3. reactnative安装

    React Native 介绍 React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是React 在原生移动应用平台的衍生产物,使用JS.JSX.CS ...

  4. k8s重启应用

    [root@k8s-master01 opt_k8s]# cat app_list xxx-supervise-srv xxx-recon-srv xxx-mkt-strategy-srv xxx-u ...

  5. 洛谷 P1832 A+B Problem(再升级)题解

    START: 2021-08-09 15:28:07 题目链接: https://www.luogu.com.cn/problem/P1832 给定一个正整数n,求将其分解成若干个素数之和的方案总数. ...

  6. Ubuntu常用命令(二)

    clash 启动 #.clash -d . sudo /home/lizhenyun/clash/clash -d /home/lizhenyun/clash/ deb包安装 sudo dpkg -i ...

  7. tensorflow的断点续训

    tensorflow的断点续训 2019-09-07 顾名思义,断点续训的意思是因为某些原因模型还没有训练完成就被中断,下一次训练可以在上一次训练的基础上继续训练而不用从头开始:这种方式对于你那些训练 ...

  8. springboot修改事务隔离级别

    [SpringBoot]事务的隔离级别.Spring的事务传播机制_51CTO博客_springboot事务隔离级别

  9. Redis学习(黑马篇)

    1.redis是一个键值型数据库即在Redis内存的数据都是键值对的格式,如: 2.NOSQL非关系型数据库与MySQL关系型数据库对比: 非结构化类型分为:键值类型(Redis)(value支持多种 ...

  10. 服务器中VirtualBox子网访问

    本人常用的虚拟机软件是VirtualBox,由于笔记本性能,磁盘存储大下限制,以及VirtualBox客户机无法在多个设备间直接方便的使用等原因,我把几个虚拟的系统全部移动到便携式服务器中. 移动之后 ...