python - 属性错误 : 'module' object has no attribute when trying to import c code into python

标签 python c

我有一个 import 来导入一个在 c 中创建的共享对象库。它看起来像这样:

import Cal

然后我尝试在 python 中使用共享对象库进行调用,如下所示:

status = Cal.Cal_readFile(filename, result)

但是,当我在运行 python 文件时遇到此代码时,出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.4/tkinter/__init__.py", line 1541, in __call__
    return self.func(*args)
  File "xcal.py", line 72, in openDialog
    status = Cal.Cal_readFile(filename, result)
AttributeError: 'module' object has no attribute 'Cal_readFile'

我关于共享对象库的 makefile 如下所示:

CC = gcc
CFLAGS = -Wall -std=c11 -g -DNDEBUG `pkg-config --cflags python3`
CFLAGS += -fPIC
LDFLAGS=`pkg-config --libs python3`

all: caltool Cal.so

Cal.so: calmodule.o calutil.o
    $(CC) -shared $(LDFLAGS) $^ -o $@

calutil.o: calutil.c calutil.h

calmodule.o: calmodule.c calutil.c

我的 C 代码如下所示:

#include <python3.4/Python.h>
#include "calutil.h"

PyObject *Cal_readFile( PyObject *self, PyObject *args );

static PyMethodDef CalMethods[] = {
  {"readFile", Cal_readFile, METH_VARARGS},
  {NULL, NULL} 
};

static struct PyModuleDef calModuleDef = {
  PyModuleDef_HEAD_INIT,
  "Cal", //enable "import Cal"
  NULL, //omit module documentation
  -1, //don't reinitialize the module
  CalMethods //link module name "Cal" to methods table 
};
PyMODINIT_FUNC PyInit_Cal(void) { 
  return PyModule_Create( &calModuleDef ); 
}

PyObject *Cal_writeFile( PyObject *self, PyObject *args ) {
  return NULL;
}

注意:Cal_writeFile 函数中确实发生了一些事情,只是我不想粘贴这个大函数,因为它可能不需要解决这个问题。

我这里有什么地方做错了吗?我觉得 Python import Cal 应该正确地导入名为 Cal.so 的共享对象库,它与 Python 文件位于同一目录中。

最佳答案

static PyMethodDef CalMethods[] = {
  {"readFile", Cal_readFile, METH_VARARGS},
  {NULL, NULL} 
};

您为函数指定的 Python 可见名称是 readFile。您需要通过该名称访问它,而不是 Cal_readFile

关于python - 属性错误 : 'module' object has no attribute when trying to import c code into python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36091759/

相关文章:

python - 除了 RAM 之外,还有哪些因素限制了 Numpy 数组的大小?这些因素可以调整吗?

python - 如何将 Tkinter 按钮状态从禁用更改为正常?

objective-c - 将 uint8_t 数组传递给方法

php - 如何在 PHP 中将守护进程变成流

python - 使用 pip 升级最初通过 apt 安装的包

python - 将图像转换为其他图像

c - 具有 posix 线程的数组的内积空间

c - DT_DIR 未定义

C 中的闭包/功能 block

python - 在 python 中划分两个非常大的数字返回 1