【问题标题】:C ->Python Import Wrapper ProblemsC -> Python 导入包装器问题
【发布时间】:2011-03-16 20:09:11
【问题描述】:

我已经像这样在我的 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:没有名为 Blarg 的模块”。我在这里有点迷路,我不明白为什么当它们的拼写完全相同时它找不到课程。可能是逻辑错误?

如果需要更多代码,请告诉我。

【问题讨论】:

  • 我忘了提到编译的 .os 文件是否有帮助
  • 你把编译好的.so文件放在哪里了? (什么目录?)你想从哪里导入它?与任何其他 Python 模块一样,用 C 编译的模块需要位于 Python 路径上才能找到。
  • 您将 .so 文件放在哪里?如果将其重命名为 Blarg.so 会发生什么?
  • 都在同一个目录.os、.c、.py和makefile
  • 在我的 cmets 中我很愚蠢,我的意思是 .so 而不是 .os 和 DNS,当您更改名称时没有任何反应。并再次运行 python。我遇到了同样的问题。

标签: python c import wrapper


【解决方案1】:

首先,通过查看 cmets,我发现重命名它不起作用。这意味着 (1) python 找不到 .so 文件,(2) .so 文件不可用(即未正确编译或未找到所有必需的符号),或 (3) 存在 .py/ .pyc/.pyo 文件位于已具有该名称的同一目录中。如果你已经定义了 Blarg.py,python 将首先查看这个文件。如果您的搜索路径中有一个名为 Blarg 的目录,情况也是如此。所以不要用头撞墙,试试这个:

1) 将您的 .so 库重命名为保证不会发生冲突的名称(即 _Blarg)

void initBlarg() {
    Py_InitModule("_Blarg", Blargmethods);
}

2) 使用 SAME NAME 编译它

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)

显然这有点矫枉过正,但它应该可以帮助您确定问题出在哪里。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2021-02-06
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多