साइथन: "घातक त्रुटि: सुन्न / arrayobject.h: ऐसी कोई फ़ाइल या निर्देशिका नहीं"


133

मैं साइथन का उपयोग करके यहां उत्तर को गति देने की कोशिश कर रहा हूं । मैं कोड को संकलित करने की कोशिश करता हूं ( cygwinccompiler.pyहैक को यहां समझाया गया है ) करने के बाद , लेकिन एक fatal error: numpy/arrayobject.h: No such file or directory...compilation terminatedत्रुटि प्राप्त करें । क्या कोई मुझे बता सकता है कि यह मेरे कोड के साथ समस्या है, या साइथन के साथ कुछ गूढ़ सूक्ष्मता है?

नीचे मेरा कोड है।

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()

क्या आप OS का उपयोग करने के लिए एक टैग जोड़ सकते हैं?
ताकसवेल

@tcaswell 64-बिट विंडोज 7.
Noob Saibot

विंडोज़ टैग को जोड़ा, उम्मीद है कि इस समस्या को उन लोगों द्वारा देखा जाएगा जो विंडोज़ (मेरे विपरीत) का उपयोग करना जानते हैं।
tacaswell

1
मुझे यह मिल गया । कुछ शब्दावली मेरे सिर के ऊपर है, लेकिन मैं इसे देख रहा हूँ।
नोब Saibot

क्या इससे आपके सवाल का जवाब मिलता है? मेक distutils सही जगह में numpy हेडर फाइल देखने के लिए
EAD

जवाबों:


186

अपने में setup.py, Extensionतर्क होना चाहिए include_dirs=[numpy.get_include()]

इसके अलावा, आप np.import_array()अपने कोड में गायब हैं ।

-

उदाहरण 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
मुझे क्यों आवश्यकता होगी np.import_array()? Numpy C-API के लिए नहीं है ?
नोब Saibot

मैंने आपके विचार की कोशिश की, लेकिन अब मुझे यह पागल त्रुटि मिली है जो यहां पोस्ट करने के लिए बहुत लंबा है, लेकिन यह इसके साथ शुरू होता हैwarning: untitled.pyx:8:49: Buffer unpacking not optimized away.
नोब साईबोट

आह, सच, आपको शायद ज़रूरत नहीं है np.import_array()। मैं शायद ही कभी इसके बिना साइपी का उपयोग करते हुए साइथन एक्सटेंशन लिखता हूं, इसलिए मैं इसे आदत के रूप में उपयोग करता हूं। आपकी अन्य समस्या के रूप में, आपने जो उद्धृत किया वह सिर्फ एक चेतावनी है, त्रुटि नहीं। यदि आपके पास अन्य त्रुटियां हैं, जिन्हें ठीक करने की आवश्यकता है, तो कृपया एक नया पोस्ट करें।
रॉबर्ट कर्ण

1
include_dirs=[numpy.get_include()]एक अच्छी चाल है धन्यवाद!
डैनियल फैरेल

14
include_dirssetup()नवीनतम डिस्टिलिट्स में नजरअंदाज करने के लिए पारित कर दिया गया है, इसे प्रत्येक को पास करना होगा Extension, कम से कम मैक पर
डैशेड

45

आपके जैसे एक-फाइल प्रोजेक्ट के लिए, एक और विकल्प का उपयोग करना है pyximport। आप एक बनाने के लिए की जरूरत नहीं है setup.py... यदि आप IPython का उपयोग भी एक कमांड लाइन को खोलने के लिए आप ... की जरूरत नहीं है यह सब बहुत सुविधाजनक है। आपके मामले में, IPython में या सामान्य पायथन स्क्रिप्ट में इन कमांड को चलाने का प्रयास करें:

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(...)
...

आपको संकलक को संपादित करने की आवश्यकता हो सकती है। यह .pyxफ़ाइलों के लिए उसी तरह आयात और पुनः लोड करता है जैसे वे .pyफ़ाइलों के लिए काम करते हैं ।

स्रोत: http://wiki.cython.org/InstallingOnWindows


धन्यवाद, @SteveB लेकिन क्या आप इस बात पर थोड़ा विस्तार से बता सकते हैं कि " आपके जैसे एक-फाइल प्रोजेक्ट के लिए ..." क्या है? ऊपर दिया गया मॉड्यूल एक बड़े एप्लिकेशन का एक (यद्यपि महत्वपूर्ण) हिस्सा है। pyximportमेरे कोड की गति को कैसे प्रभावित करता है ? और अंत में, यहां अनुभाग: " साइथॉन 0.11 के बाद से, पाइमसपोर्ट मॉड्यूल में सामान्य पायथन मॉड्यूल के लिए प्रायोगिक संकलन समर्थन भी है ..." इसका मतलब है कि यह अभी भी काम करने के लिए कुछ किंक है। क्या आप उसे भी समझा सकते हैं?
नोब साईबोट

1
पुन: "सामान्य पायथन मॉड्यूल के लिए प्रयोगात्मक संकलन समर्थन" - जैसा कि मैंने ऊपर दिए गए कोड के साथ, .pyमॉड्यूल सामान्य रूप से संकलित किया जाता है (साइथन के साथ नहीं) जबकि .pyxमॉड्यूल साइथन के साथ संकलित किए जाते हैं। यदि आप इसमें पास pyimport = Trueहोते हैं pyximport.install(), तो यह सब कुछ के लिए साइथन का उपयोग करेगा, यहां तक ​​कि उदाहरण के लिए import randomया import os। मैं उस सुविधा का उपयोग करने का सुझाव नहीं देता, केवल इसलिए कि इसका उपयोग करने के लिए कोई बाध्यकारी कारण नहीं है, और यह समस्याएं पैदा कर सकता है। इसका उपयोग संभवतः मुख्य रूप से साइथन डेवलपर्स द्वारा किया जाता है।
स्टीव बायरेंस

यदि pyximportयह सब काम करता है, तो यह किसी अन्य विधि के समान सटीक C कोड बनाएगा। तो कोशिश करो और देखो। मैं तथ्य यह है कि जब संकलन प्रक्रिया पर्याप्त जटिल है, बाहरी प्रणाली पुस्तकालयों के लिए उदाहरण के लिए लिंक, आपको लगता है कि pyximport मिल सकती है करने के लिए बात कर रहे थे विफल रहता है और आप एक की जरूरत है setup.pyऔर cythonizeनिर्दिष्ट करने के लिए वास्तव में यह कैसे बनाने के लिए। लेकिन तथ्य यह है कि आपके .pyxमॉड्यूल ने imports या cimports का मतलब यह नहीं है कि इसे संकलित नहीं किया जा सकता है pyximport; यह पूरी तरह से ठीक हो सकता है।
स्टीव बायरेंस

मेरे पास एक साइथन पोस्ट है जिस पर आप जानकारी दे सकते हैं।
फिलिप

14

त्रुटि का मतलब यह है कि संकलन के दौरान एक संख्यात्मक हेडर फ़ाइल नहीं मिल रही है।

करने की कोशिश करो export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/, और फिर संकलन। यह कुछ अलग पैकेज के साथ एक समस्या है। उसी मुद्दे के लिए ArchLinux में एक बग दर्ज किया गया है: https://bugs.archlinux.org/task/22326


मैं exportलाइन कहाँ जोड़ूँ ? मेरी setup.pyफाइल में?
नोब Saibot

नहीं, यह एक शेल कमांड है। इसे अपने शेल में चलाएं, फिर संकलन शुरू करें।
जॉन ब्रॉडी

@NoobSaibot शेल में (जहाँ आप चलाते हैं python setup.py) export ..पहले कमांड चलाते हैं । यह खोल के पर्यावरणीय चर को सेट करता है, सीधे कुछ भी नहीं [पीसी] ython के साथ करने के लिए।
tacaswell

@ टासवेल: मुझे उतना ही लगा। मैं cmd ​​का उपयोग कर रहा हूं, और मुझे यह 'export' is not recognized as an internal or external command, operable program or batch file.त्रुटि मिली ... बस इस एक के साथ नहीं जीत सकते ...
Noob Saibot

4
@NoobSaibot आपको एक विंडोज़ समस्या की तरह बदबू आ रही है के लिए लुनिक्स उत्तर मिल रहा है ....
tacaswell

1

सरल उत्तर

एक आसान तरीका यह है कि अपनी फ़ाइल में पथ जोड़ें distutils.cfg। यह डिफ़ॉल्ट रूप से विंडोज 7 का मार्ग है C:\Python27\Lib\distutils\। आप बस निम्नलिखित सामग्री पर जोर देते हैं और यह काम करना चाहिए:

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

पूरी विन्यास फाइल

आपको एक उदाहरण देने के लिए कि विन्यास फाइल कैसे दिख सकती है, मेरी पूरी फ़ाइल पढ़ती है:

[build]
compiler = mingw32

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


1

यदि आप सेटअप फ़ाइलें लिखने और निर्देशिकाओं को शामिल करने के लिए पथ का पता लगाने के लिए बहुत आलसी हैं, तो साइबर प्रयास करें । यह आपके साइथॉन कोड को संकलित कर सकता है और include_dirsNumpy के लिए स्वचालित रूप से सेट कर सकता है ।

अपने कोड को एक स्ट्रिंग में लोड करें, फिर बस चलाएं cymodule = cyper.inline(code_string), फिर आपका फ़ंक्शन cymodule.sparsemakerतुरंत उपलब्ध है । कुछ इस तरह

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

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

आप के माध्यम से साइबर स्थापित कर सकते हैं pip install cyper

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.