C到Python导入包装问题
我在我的C语言文件blargUtils.c中定义了一个包装对象的名字,像这样(我在Blargmethods中定义了方法等等)...
void initBlarg(){
Py_InitModule("Blarg", Blargmethods);
}
我这样编译它...
blarglib: blargUtils.c
gcc -I/usr/include/python2.6 -fPIC -c blargUtils.c -Wall
gcc -shared blargUtils.o -o blargUtils.so
clean:
rm *.so
但是,当我尝试在我的Python脚本中导入这个包装时...
import Blarg
它显示:“ImportError: No module named Blarg”。我有点迷糊,不明白为什么它找不到这个类,明明拼写是完全一样的。也许是逻辑错误?
如果需要更多代码,请告诉我。
1 个回答
1
首先,从评论中可以看出,改名字并没有解决问题。这意味着可能有几个原因:第一,python找不到这个.so文件;第二,这个.so文件不能用(也就是说可能没有正确编译,或者缺少必要的符号);第三,当前目录下可能有一个同名的.py/.pyc/.pyo文件。如果你已经定义了一个叫Blarg.py的文件,python会优先查看这个文件。如果你的搜索路径中有一个叫Blarg的目录,也是一样的。所以与其在这里纠结,不如试试这个方法:
1) 把你的.so库改成一个不容易重复的名字(比如说改成_Blarg)
void initBlarg() {
Py_InitModule("_Blarg", Blargmethods);
}
2) 用这个新名字重新编译
gcc -I/usr/include/python2.6 -fPIC -c blargUtils.c -Wall
gcc -shared blargUtils.o -Wl,-soname -Wl,_Blarg.so -o _Blarg.so
3) 创建一个python的包装文件(也就是Blarg.py)
import sys
sys.path.append('/path/to/your/library')
import _Blarg
def blargFunc1(*args):
"""Wrap blargFunc1"""
return _Blarg.blargFunc1(*args)
4) 现在就可以正常使用了
import Blarg
Blarg.blargFunc1(1, 2, 3)
当然,这个方法有点复杂,但应该能帮助你找到问题所在。希望这对你有帮助。