C到Python导入包装问题

1 投票
1 回答
743 浏览
提问于 2025-04-16 13:51

我在我的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)

当然,这个方法有点复杂,但应该能帮助你找到问题所在。希望这对你有帮助。

撰写回答