将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. 无线电(手台、APRS)

    泉胜手台操作:(TG-UV2)----------------------------------------------- MR/VFO: 频率模式指示F:信道模式指示M F+MAIN: 主副频转换 ...

  2. 12.14linux学习第十七天

    今天老刘收了下第13章尾巴,讲了第14章和第15章. 13.6 分离解析技术 现在,喜欢看我们这本<Linux就该这么学>的海外读者越来越多,如果继续把本书配套的网站服务器(https:/ ...

  3. jq的用法

    选择页面中的元素,得到jQuery实例对象 ID选择器$("#save") 类选择器$(".class") 标签选择器$("div") 复合 ...

  4. 8、HTTP Cookie管理器

    如果有需要加的cookie 就选择添加  如果没有特殊的 就默认就好了 第一次访问是没有cookie的 会话  session Cookie 是明文的  Session  id 是保存在cookie里 ...

  5. Servlet's characters of get and post

    Tomcat默认是使用ISO8859-1来解码的,ISO8859-1是不支持中文的. 1.post请求解决乱码原因: 服务器不知道按哪种编码来处理HTML等文件来响应给浏览器的,所以处理post请求时 ...

  6. C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法

    main.c: #include <stdio.h> #include <stdlib.h> #include "SequenceList.h" int m ...

  7. for in循环的坑

    num本来数个数组,但是for in把数组原型上的也遍历(偶尔会)记录一下坑,数组还是for循环,for in还是用在对象上好

  8. 记录一次MySQL主从同步

    主库配置 server-id=1log-bin=mysql-binbinlog_format=ROWbinlog_row_image=minimalbinlog-do-db=yjtb-cloud 解释 ...

  9. POI给单元格添加超链接(xls,xlsx)

    package com.topcheer.html; import java.io.FileOutputStream; import java.io.IOException; import org.a ...

  10. C#比较类/接口、Dictionary 排序

    作者:l625208058 链接:https://www.jianshu.com/p/cd1be6652570 先 F12 看下 List.Sort() 方法 public void Sort(int ...