Cython: "ölümcül hata: numpy / arrayobject.h: Böyle bir dosya veya dizin yok"


134

Buradaki cevabı Cython kullanarak hızlandırmaya çalışıyorum . Kodu derlemeye çalışıyorum ( buradacygwinccompiler.py açıklanan hack işlemini yaptıktan sonra ), ancak bir hata alıyorum. Biri bana kodumla ilgili bir sorun mu yoksa Cython ile ilgili bazı ezoterik incelikler mi söyleyebilir?fatal error: numpy/arrayobject.h: No such file or directory...compilation terminated

Kodum aşağıdadır.

import numpy as np
import scipy as sp
cimport numpy as np
cimport cython

cdef inline np.ndarray[np.int, ndim=1] fbincount(np.ndarray[np.int_t, ndim=1] x):
    cdef int m = np.amax(x)+1
    cdef int n = x.size
    cdef unsigned int i
    cdef np.ndarray[np.int_t, ndim=1] c = np.zeros(m, dtype=np.int)

    for i in xrange(n):
        c[<unsigned int>x[i]] += 1

    return c

cdef packed struct Point:
    np.float64_t f0, f1

@cython.boundscheck(False)
def sparsemaker(np.ndarray[np.float_t, ndim=2] X not None,
                np.ndarray[np.float_t, ndim=2] Y not None,
                np.ndarray[np.float_t, ndim=2] Z not None):

    cdef np.ndarray[np.float64_t, ndim=1] counts, factor
    cdef np.ndarray[np.int_t, ndim=1] row, col, repeats
    cdef np.ndarray[Point] indices

    cdef int x_, y_

    _, row = np.unique(X, return_inverse=True); x_ = _.size
    _, col = np.unique(Y, return_inverse=True); y_ = _.size
    indices = np.rec.fromarrays([row,col])
    _, repeats = np.unique(indices, return_inverse=True)
    counts = 1. / fbincount(repeats)
    Z.flat *= counts.take(repeats)

    return sp.sparse.csr_matrix((Z.flat,(row,col)), shape=(x_, y_)).toarray()

Kullandığınız işletim sistemi için bir etiket ekleyebilir misiniz?
tacaswell

@tcaswell 64-bit Windows 7.
Noob Saibot 21

Windows etiketini ekledi, umarım bu sorunun pencereleri nasıl kullanacağını bilen insanlar tarafından görülmesine yardımcı olur (benden farklı olarak).
tacaswell

1
Bulduğum bu . Terminolojinin bir kısmı kafamın üstünde, ama kontrol edeceğim.
Noob Saibot

Bu sorunuzu yanıtlıyor mu? Dağıtımların doğru yerde
uyuşmuş

Yanıtlar:


188

Gözlerinde farklı setup.py, Extensionargüman olmalıdır include_dirs=[numpy.get_include()].

Ayrıca, np.import_array()kodunuzda eksiksiniz.

-

Örnek setup.py:

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

setup(
    ext_modules=[
        Extension("my_module", ["my_module.c"],
                  include_dirs=[numpy.get_include()]),
    ],
)

# Or, if you use cythonize() to make the ext_modules list,
# include_dirs can be passed to setup()

setup(
    ext_modules=cythonize("my_module.pyx"),
    include_dirs=[numpy.get_include()]
)    

4
Neden ihtiyacım olsun np.import_array()? Bu Numpy C-API için değil mi?
Noob Saibot

warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
Fikrinizi

Ah, doğru, muhtemelen ihtiyacın yok np.import_array(). O olmadan nadiren uyuşmuş Cython uzantılarını yazıyorum, bu yüzden alışkanlık olarak kullanıyorum. Diğer probleminize gelince, aktardığınız şey bir hata değil, sadece bir uyarıdır. Düzeltilmesi gereken başka hatalarınız varsa, lütfen yeni bir gönderi yapın.
Robert Kern

1
include_dirs=[numpy.get_include()]güzel bir numara teşekkür ederim!
Daniel Farrell

14
include_dirsgeçirilen setup()son distutils göz ardı alır, her geçirilecek vardır Extensionen azından mac üzerinde,
dashesy

45

Sizinki gibi tek dosyalık bir proje için başka bir alternatif kullanmaktır pyximport. Bir oluşturmak gerekmez setup.pyIPython kullanırsanız bile bir komut satırı açmak üzere hepsi çok uygun ... ihtiyacım yok .... Sizin durumunuzda, bu komutları IPython'da veya normal bir Python betiğinde çalıştırmayı deneyin:

import numpy
import pyximport
pyximport.install(setup_args={"script_args":["--compiler=mingw32"],
                              "include_dirs":numpy.get_include()},
                  reload_support=True)

import my_pyx_module

print my_pyx_module.some_function(...)
...

Elbette derleyiciyi düzenlemeniz gerekebilir. Bu, .pyxdosyalar için çalışırken içeri aktarma ve yeniden yüklemenin de aynı şekilde çalışmasını .pysağlar.

Kaynak: http://wiki.cython.org/InstallingOnWindows


Teşekkürler @SteveB. Ama " Sizinki gibi tek dosyalık bir proje için ..." derken neyi kastettiğinizi biraz açabilir misiniz ? Yukarıdaki modül, daha büyük bir uygulamanın (önemli olsa da) bir parçasıdır. Kodumun pyximporthızını nasıl etkiler? Ve son olarak, buradaki bölüm: " Cython 0.11'den beri, pyximport modülü, normal Python modülleri için deneysel derleme desteğine de sahiptir ..." , hala çözülmesi gereken bazı karışıklıklar olduğunu ima eder. Bunu da açıklayabilir misin?
Noob Saibot

1
Yeniden "normal Python modülleri için deneysel derleme desteği" - yukarıda önerdiğim kodla, .pymodüller cython ile derlenirken modüller normal olarak derlenir (cython ile değil) .pyx. Eğer başarılı olursa pyimport = Trueiçine pyximport.install(), o zaman bile, örneğin her şey için Cython kullanacak import randomveya import os. Bu özelliği kullanmayı önermiyorum, çünkü onu kullanmak için ikna edici bir neden yok ve sorun yaratabilir. Muhtemelen esas olarak cython geliştiricileri tarafından kullanılıyor.
Steve Byrnes

Eğer pyximporthiç eserler, herhangi bir başka yöntem olarak aynı C kodu oluşturur. Öyleyse dene ve gör. Derleme işlemi yeterince karmaşık olduğunda, örneğin harici sistem kitaplıklarına bağlantılar olduğunda, pyximport'un başarısız olduğunu fark edebilirsiniz ve a setup.pyve cythonizetam olarak nasıl kurulacağını belirtmeniz gerekir. Ancak .pyxmodülünüzde " importler" veya " cimportler bulunması gerçeği ile derlenemeyeceği anlamına gelmez pyximport; tamamen iyi olabilir.
Steve Byrnes

Hakkında bilgi sağlayabileceğiniz bir Cython gönderim var.
Phillip

14

Hata, derleme sırasında bir numpy başlık dosyasının bulunmadığı anlamına gelir.

export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/Yapmayı ve sonra derlemeyi deneyin . Bu, birkaç farklı paketle ilgili bir sorundur. ArchLinux'da aynı sorun için dosyalanmış bir hata var: https://bugs.archlinux.org/task/22326


exportSatırı nereye eklerim ? Benim içinde setup.pydosyaya?
Noob Saibot

Hayır, bu bir kabuk komutu. Kabuğunuzda çalıştırın, ardından derlemeye başlayın.
John Brodie

Kabuktaki @NoobSaibot (çalıştırdığınız yer python setup.py) önce export ..komutu çalıştırın . Doğrudan [pc] ython ile ilgili hiçbir şeyi değil, kabuğun çevresel değişkenlerini ayarlar.
tacaswell

@tcaswell: Ben de öyle düşündüm. Cmd kullanıyorum ve bu 'export' is not recognized as an internal or external command, operable program or batch file.hatayı aldım ... bununla kazanamıyorum ...
Noob Saibot

4
@NoobSaibot Windows problemi gibi koktuğunuz için lunix cevapları alıyorsunuz ....
tacaswell

1

Basit cevap

Daha basit bir yol, dosyanızın yolunu eklemektir distutils.cfg. Varsayılan olarak Windows 7'nin yoludur C:\Python27\Lib\distutils\. Sadece aşağıdaki içeriği ileri sürüyorsunuz ve işe yaramalı:

[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include

Tüm yapılandırma dosyası

Yapılandırma dosyasının nasıl görünebileceğine dair bir örnek vermek gerekirse, dosyamın tamamı şunları okur:

[build]
compiler = mingw32

[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
compiler = mingw32

1

İçinde bunu yapmak mümkün olmalıdır cythonize()belirtildiği gibi işlevi burada , ama bir orada beacuse çalışmıyor bilinen sorun


1

Kurulum dosyalarını yazamayacak kadar tembelseniz ve dizinleri içerme yolunu bulamayacak kadar tembelseniz , cyper'ı deneyin . Cython kodunuzu derleyebilir ve include_dirsotomatik olarak Numpy için ayarlayabilir.

Kodunuzu bir dizeye yükleyin, ardından çalıştırın cymodule = cyper.inline(code_string), ardından işleviniz cymodule.sparsemakeranında kullanılabilir hale gelir . Bunun gibi bir şey

code = open(your_pyx_file).read()
cymodule = cyper.inline(code)

cymodule.sparsemaker(...)
# do what you want with your function

Cyper'ı üzerinden yükleyebilirsiniz pip install cyper.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.