pyx文件编译成so库

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文件的编译;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值