将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文件
标签:文件,join,fw,py,write,so,file,print,path From: https://www.cnblogs.com/moon3496694/p/17198578.html