【Ubuntu】将多个python文件打包为.so文件
1.为什么要将python打包为.so文件?
保���源码
2.实战例子
a.安装相应的包
pip install cython
验证安装是否成功
cython --version
b.实战的文件目录和内容
hi.py
# This is a sample Python script. # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. def print_hi(name): # Use a breakpoint in the code line below to debug your script. print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi('PyCharm') # See PyCharm help at https://www.jetbrains.com/help/pycharm/
hello.py
def hello(name): print("hello " + name)
bye.py
def bye(name): print("bye " + name)
setup.py
把需要转换的py文件都放进去
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize(["hi.py", "hello.py", "bye.py"]))
terminal运行命令
python setup.py build_ext
运行log
Compiling hi.py because it changed. Compiling hello.py because it changed. Compiling bye.py because it changed. [1/3] Cythonizing bye.py /home/huanglu/anaconda3/envs/segment-system/lib/python3.10/site-packages/Cython/Compiler/Main.py:381: FutureWarning: Cython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: /home/huanglu/Desktop/liubin/so-test/bye.py tree = Parsing.p_module(s, pxd, full_module_name) [2/3] Cythonizing hello.py /home/huanglu/anaconda3/envs/segment-system/lib/python3.10/site-packages/Cython/Compiler/Main.py:381: FutureWarning: Cython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: /home/huanglu/Desktop/liubin/so-test/hello.py tree = Parsing.p_module(s, pxd, full_module_name) [3/3] Cythonizing hi.py /home/huanglu/anaconda3/envs/segment-system/lib/python3.10/site-packages/Cython/Compiler/Main.py:381: FutureWarning: Cython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: /home/huanglu/Desktop/liubin/so-test/hi.py tree = Parsing.p_module(s, pxd, full_module_name)
运行结果
可以发现多了几个.c文件和build文件夹
build文件夹中
复制到根目录
在根目录里, 写一个demo.py
from hi import print_hi from hello import hello from bye import bye print_hi("K.D.") hello("LeBron") bye("Kobe")
运行
Hi, K.D. hello LeBron bye Kobe Process finished with exit code 0
把hi.py,hello.py,bye.py删除,再执行demo.py,可以得到同样的结果
即 此时已经使用到了.so文件,而不是原来的.py文件
如果.py在不同文件夹中,则在不同文件夹里面执行类似操作。
待续。。
The End