Компиляция Cython с помощью gcc: нет такого файла или каталога из #include "ios" - PullRequest
0 голосов
/ 25 ноября 2018

Имеется файл docprep.pyx

import numpy
from cymem.cymem cimport Pool
from spacy.tokens.doc cimport Doc
from spacy.typedefs cimport hash_t
from spacy.structs cimport TokenC
from spacy.strings import hash_string


cdef struct DocElement:
    TokenC* c
    int length


cdef int fast_loop(DocElement* docs, int n_docs, hash_t word, hash_t tag):
    cdef int n_out = 0
    for doc in docs[:n_docs]:
        for c in doc.c[:doc.length]:
            if c.lex.lower == word and c.tag == tag:
                n_out += 1
    return n_out


def main_nlp_fast(doc_list):
    cdef int i, n_out, n_docs = len(doc_list)
    cdef Pool mem = Pool()
    cdef DocElement* docs = <DocElement*>mem.alloc(n_docs, sizeof(DocElement))
    cdef Doc doc
    # Populate our database structure
    for i, doc in enumerate(doc_list):
        docs[i].c = doc.c
        docs[i].length = (<Doc>doc).length
    word_hash = hash_string('run')
    tag_hash = hash_string('NN')
    n_out = fast_loop(docs, n_docs, word_hash, tag_hash)
    print(n_out)


docs = [Doc("asd run NN ddd")]
main_nlp_fast(docs)

Я скомпилирован в C с помощью Cython:

cython -X language_level=3 docprep.pyx

С системными путями, определенными так:

import numpy
import sysconfig
numpy.get_include()
sysconfig.get_paths()['include']

Я попытался скомпилировать файл C с помощью GCC:

gcc docprep.c -I '/home/torstein/anaconda3/include/python3.7m' -I '/home/torstein/anaconda3/lib/python3.7/site-packages/numpy/core/include' -L '/home/torstein/anaconda3/lib/python3.7' -lpython3.7 -o docprep.o

Но получите:

In file included from /home/torstein/anaconda3/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1823,
                 from /home/torstein/anaconda3/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:18,
                 from /home/torstein/anaconda3/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,
                 from docprep.c:610:
/home/torstein/anaconda3/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
 #warning "Using deprecated NumPy API, disable it by " \
  ^~~~~~~
docprep.c:613:10: fatal error: ios: No such file or directory
 #include "ios"
          ^~~~~
compilation terminated

Как вы можете судить по путям, эта система имеет установку Anaconda с Python 3.7.numpy, spacy и cython установлены через conda.

1 Ответ

0 голосов
/ 23 мая 2019

В моем случае это работало с использованием подсказки @mountrix, просто добавьте language="c++" в файл setup.py, например:

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


extensions = [
    Extension("processing_module", sources=["processing_module.pyx"], include_dirs=[numpy.get_include()], extra_compile_args=["-O3"], language="c++")
]

setup(
    name="processing_module",
    ext_modules = cythonize(extensions),
)
...