সিথন: "মারাত্মক ত্রুটি: নম্পি / অ্যারেবজেক্ট। এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"


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

আপনি কী ওএস ব্যবহার করছেন তার জন্য আপনি একটি ট্যাগ যুক্ত করতে পারেন?
টাকসওয়েল

@tcaswell 64-বিট উইন্ডোজ 7
Noob Saibot

উইন্ডোজ ট্যাগ যুক্ত করা হয়েছে, আশা করা যায় যে এই সমস্যাটি এমন লোকদের দ্বারা দেখাতে সহায়তা করবে যারা জানালা ব্যবহার করতে জানেন (আমার বিপরীতে)।
টাকসওয়েল

1
আমি দেখেছি এই । কিছু পরিভাষা আমার মাথার উপরে, তবে আমি এটি পরীক্ষা করে দেখছি।
নুব সাইবোট

এটা কি তোমার প্রশ্নের উত্তর? মেক 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()? এটি কি নম্পি সি-এপিআই-এর জন্য নয় ?
নুব সাইবোট

আমি আপনার ধারণার চেষ্টা করেছি, তবে এখন আমি এই ক্রেজি ত্রুটিটি পেয়েছি যা এখানে পোস্ট করা খুব দীর্ঘ, তবে এটি দিয়ে শুরু হয়warning: untitled.pyx:8:49: Buffer unpacking not optimized away.
নূব সাইবোট

আহ, সত্য, আপনার সম্ভবত দরকার নেই np.import_array()। যদিও আমি খুব কমই সাইথন এক্সটেনশনগুলি এগুলি ছাড়া লিখি, তবে আমি এটি অভ্যাসের বিষয় হিসাবে ব্যবহার করি। আপনার অন্যান্য সমস্যা হিসাবে, আপনি যা উদ্ধৃত করেছেন তা কেবল একটি ত্রুটি নয়। আপনার যদি অন্য ত্রুটিগুলিও ঠিক করতে হয় তবে দয়া করে একটি নতুন পোস্ট করুন।
রবার্ট কার্ন

1
include_dirs=[numpy.get_include()]একটি দুর্দান্ত কৌশল আপনাকে ধন্যবাদ!
ড্যানিয়েল ফারেল

14
include_dirsপ্রেরণ করা setup()সর্বশেষ distutils উপেক্ষা পরার, এটা প্রতিটি প্রেরণ করা হয়েছে Extension, অন্তত ম্যাক উপর
dashesy

45

আপনার মতো এক-ফাইল প্রকল্পের জন্য, অন্য বিকল্প ব্যবহার করা pyximport। আপনার একটি তৈরি করার দরকার নেই setup.py... আপনি আইপিথন ব্যবহার করলে আপনার একটি কমান্ড লাইনও খোলার দরকার নেই ... এটি সমস্ত খুব সুবিধাজনক। আপনার ক্ষেত্রে, আইপিথন বা একটি সাধারণ পাইথন স্ক্রিপ্টে এই আদেশগুলি চালনার চেষ্টা করুন:

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


ধন্যবাদ, @ স্টিভবি। তবে " আপনার মতো একটি ফাইলের প্রকল্পের জন্য ..." বলতে আপনি কী বোঝাতে চেয়েছেন তার কিছুটা ব্যাখ্যা করতে পারেন ? উপরের মডিউলটি বৃহত্তর প্রয়োগের একটি (গুরুত্বপূর্ণ হলেও) অংশ important কীভাবে pyximportআমার কোডের গতি প্রভাবিত করে ? এবং অবশেষে, এখানে বিভাগ: " সাইথন 0.11 সাল থেকে পাইক্সিম্পোর্ট মডিউলটিতে সাধারণ পাইথন মডিউলগুলির জন্য পরীক্ষামূলক সংকলন সমর্থনও রয়েছে ..." বোঝা যাচ্ছে যে এটির কাজ করার জন্য এখনও কিছু সংযোগ রয়েছে। আপনি কি তাও ব্যাখ্যা করতে পারেন?
নুব সাইবোট

1
পুনরায় "সাধারণ পাইথন মডিউলগুলির জন্য পরীক্ষামূলক সংকলন সমর্থন" - আমি উপরে প্রস্তাবিত কোড সহ .pyমডিউলগুলি সাধারণত (সিথনের সাথে নয়) .pyxসংকলিত হয় এবং মডিউলগুলি সিথনের সাথে সংকলিত হয়। যদি আপনি এর মধ্যে প্রবেশ pyimport = Trueকরেন pyximport.install()তবে এটি সমস্ত কিছুর জন্য সিথন ব্যবহার করবে, এমনকি উদাহরণস্বরূপ import randomবা import os। আমি এই বৈশিষ্ট্যটি ব্যবহার করার পরামর্শ দিচ্ছি না, কেবল কারণ এটির ব্যবহারের কোনও বাধ্যতামূলক কারণ নেই এবং এটি সমস্যা তৈরি করতে পারে। এটি সম্ভবত সাইথন বিকাশকারীরা ব্যবহার করেছেন।
স্টিভ বাইর্নেস

যদি pyximportকিছুটা কাজ করে তবে এটি অন্য যে কোনও পদ্ধতির মতো হুবহু সি কোড তৈরি করবে। সুতরাং এটি চেষ্টা করুন এবং দেখুন। আমি সত্য যে যখন সংকলন প্রক্রিয়া পর্যাপ্ত জটিল, বাহ্যিক সিস্টেম লাইব্রেরী যেমন লিংক, আপনি যে pyximport পেতে পারে উল্লেখ ছিল ব্যর্থ এবং আপনি একটি প্রয়োজন setup.pyএবং cythonizeনির্দিষ্ট করার ঠিক কিভাবে এটা নির্মাণ করতে। তবে আপনার .pyxমডিউলটির imports বা cimports এর অর্থ এই নয় যে এটি সংকলন করা যায় না pyximport; এটি পুরোপুরি ভাল হতে পারে।
স্টিভ বাইর্নেস

আমার কাছে একটি সিথন পোস্ট রয়েছে যাতে আপনি অন্তর্দৃষ্টি দিতে সক্ষম হবেন।
ফিলিপ

14

ত্রুটিটির অর্থ হ'ল সংকলনের সময় একটি নমপি শিরোনাম ফাইলটি খুঁজে পাওয়া যাচ্ছে না।

করার চেষ্টা করুন export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/এবং তারপরে সংকলন করুন। এটি কয়েকটি ভিন্ন প্যাকেজ নিয়ে সমস্যা। একই সমস্যার জন্য আর্কলিনাক্সে একটি বাগ দায়ের করা আছে: https://bugs.archlinux.org/task/22326


আমি কোথায় exportলাইন যুক্ত করব? আমার setup.pyফাইল?
নুব সাইবোট

না এটি শেল কমান্ড এটি আপনার শেলের মধ্যে চালান, তারপরে সংকলন শুরু করুন।
জন ব্রোডি

শেলটিতে @ নুবসাইবট (যেখানে আপনি চালাবেন python setup.py) export ..প্রথমে কমান্ডটি চালান । এটি শেলের পরিবেশগত পরিবর্তনশীলগুলি সেট করে, [পিসি] ইথনের সাথে সরাসরি করার মতো কিছুই নয়।
টাকসওয়েল

@ টিক্যাসওয়েল: আমি অনেকটা দেখেছি। আমি সেন্টিমিডি ব্যবহার করছি, এবং এই 'export' is not recognized as an internal or external command, operable program or batch file.ত্রুটিটি পেয়েছি ... কেবল
এইটির

4
@ নুবসাইবোট আপনি উইন্ডোজ সমস্যার মতো গন্ধ পাচ্ছেন তার জন্য আপনি লুনিক্স উত্তর পেয়ে যাচ্ছেন ....
টাকাসওয়েল

1

সহজ উত্তর

একটি উপায় সহজ উপায় হ'ল আপনার ফাইলে পাথ যুক্ত করা distutils.cfg। এটা তোলে এর উইন্ডোজ 7 পথ পক্ষ ডিফল্টরূপে হয় C:\Python27\Lib\distutils\। আপনি কেবল নীচের বিষয়বস্তুকে দৃsert়ভাবে উল্লেখ করেছেন এবং এটি কার্যকর হওয়া উচিত:

[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

এখানেcythonize() উল্লিখিত হিসাবে এটি ফাংশনটির মধ্যে এটি করতে সক্ষম হওয়া উচিত , তবে এটি একটি কার্যকর সমস্যা রয়েছে এমন বীচি ব্যবহার করে না


1

আপনি যদি সেটআপ ফাইল লিখতে এবং অধ্যায়ের ডিরেক্টরি অন্তর্ভুক্ত করার জন্য পথ খুঁজে বের করতে খুব অলস হন তবে সায়পার চেষ্টা করুন । এটি আপনার সিথন কোডটি সংকলন করতে পারে এবং include_dirsস্বয়ংক্রিয়ভাবে নম্পির জন্য সেট করতে পারে।

আপনার কোডটি স্ট্রিংয়ে লোড করুন, তারপরে কেবল চালান 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.