预期:导入时平面命名空间错误

时间:2016-10-10 16:27:39

标签: python cython

导入我使用Cython创建的模块时,我得到:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dlopen(./something.so, 2): Symbol not found: _something
  Referenced from: ./something.so
  Expected in: flat namespace
 in ./something.so

我的C代码是:

#include <stdio.h>

void print_something(void)
{
    printf("Hello iris\n");
}

int return_something(int x)
{
    return x*x;
}

我的.pyx文件是:

cimport numpy as np
cimport cython

cdef extern from "my_header.h": 
    void something()
    ctypedef unsigned int x
    int return_something(int x)

def my_func():
    something()

def x2(x):
    cdef int X = x 
    return return_something(X)

cimportctypedef unsigned int xcdef int X = x是我尝试使用此功能的尝试,我不确定是否需要它们。我试过没有这些补充也无济于事。

最后,我的setup.py看起来像这样:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import os
import numpy

# important to include "my_function.c" in the sources list
ext_modules=[Extension("something", 
                        sources=["something.pyx", "my_function.c" ],
                        include_dirs=[numpy.get_include()])]


setup(name="something",
      ext_modules = cythonize(ext_modules))

我可以编译C代码并运行它,所以我猜测.pyx有问题。

1 个答案:

答案 0 :(得分:0)

只是一个补充:上面的评论帮助我弄清了我为几天苦苦挣扎的实际错误。在OP的情况下,他从C(C ++)用Python导入的术语在他的C / C ++程序中未定义。就我而言,我有一些错误的类型定义,例如

std::vector<int> generate_2CNF(
    std::vector<uint64_t> &
);

在我的.h文件和

std::vector<int> generate_2CNF(
    std::vector<long> &
){ ... }

在我的.cpp实现文件中。奇怪的是,对我来说,我似乎只编译了cpp部分而没有Python,但是没有得到任何错误。

由于代码中的这种不一致,我遇到了与OP相同的错误。直到最后一刻,我相信这不是代码中的错误,而是链接程序中的错误。事实证明,这类错误不容易发现,因为编译器无法帮助您指出确切的不一致之处。如果您使用Cython,只需仔细检查一下.cpp / .c代码中是否没有实际错误,否则以后将很难调试它。