pyx文件
# file: hello.pyx
def say_hello_to(name):
print("Hello %s!" % name)
# file: setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(name='Hello world app',
ext_modules=cythonize("hello.pyx"))
编译项目:python setup.py build_ext --inplace
生成:
hello.cpython-36m-x86_64-linux-gnu.so
build 文件夹
hello.c文件
# coding: utf-8
import hello
hello.say_hello_to('张三')
输出:Hello 张三
上面所有文件都一同一个目录下,这个import会不会是导入了hello.py文件呢;于是复制修改pyx文件为py文件并修改如下
# file: hello.py
def say_hello_to(name):
print("Nyang Hello %s!" % name)
仍然输出Hello 张三
说明当前的import是找到了so文件。
另外一种证明思路:将so文件移走,再执行test测试
会引用hello.py文件,输出 修改后的结果。
那么是不是只用so文件就可以了呢?
将so文件与test文件移走,执行新的测试
结论证明,只需要so文件即可。
这种情况只需要so文件,是不是因为所有需要编译的内容均在pyx文件中,所以可以移走呢?so文件的本质是什么呢?
新的实验:
第一步、在hell.pyx文件中加入对who.py的导入,
第二步、然后删除原有的so文件与c文件,
第三步、然后python setup build_ext --inplace,最后 python test.py ;
第四步、最后将so文件和test.py移到其他目录下,再执行test;
结果:第三步输出了新的结果;而第四步执行完后,提示错误:no module name的who
这也说明so文件的本质只是对pyx文件的编码,依赖的其他库是没有包含进来的;
那么如果有依赖,就说明不能单单移走so文件;那么怎么办呢?能不能实现将所有的依赖文件都编译进so库里呢?
从理论下来讲,是有难度的,so文件是仅仅是pyx文件的编译;