python Distutils सही जगह पर numpy शीर्षलेख फ़ाइलों के लिए देखो




cython (2)

numpy.get_include() उपयोग करें:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np                           # <---- New line

ext_modules = [Extension("hello", ["hello.pyx"])]

setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': build_ext},
  include_dirs = [np.get_include()],         # <---- New line
  ext_modules = ext_modules
)

मेरी स्थापना में, numpy's arrayobject.h …/site-packages/numpy/core/include/numpy/arrayobject.h । मैंने एक छोटी सी सिंथॉन लिपि लिखी जो numpy का उपयोग करता है:

cimport numpy as np

def say_hello_to(name):
    print("Hello %s!" % name)

मेरे पास निम्नलिखित distutils setup.py ( साइथन उपयोगकर्ता मार्गदर्शिका से कॉपी):

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("hello", ["hello.pyx"])]

setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

जब मैं python setup.py build_ext --inplace साथ निर्माण करने का प्रयास करता python setup.py build_ext --inplace , तो python setup.py build_ext --inplace निम्न कार्य करने का प्रयास करता है:

gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd \
-fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX \
-I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe \
-I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 \
-c hello.c -o build/temp.macosx-10.5-i386-2.5/hello.o

arrayobject.h , यह arrayobject.h खोजने में विफल रहता है। मैं distutils के सही स्थान का उपयोग फ़ाइलों को कैसे शामिल कर सकता हूं (उपयोगकर्ता को $ CFLAGS परिभाषित किए बिना)?


@ Vebjorn-ljosa द्वारा दिए गए उत्तर सही हैं, लेकिन यह install_requires=['numpy'] संयोजन के साथ उपयोग की जाने वाली समस्याओं का कारण बनता है। इस स्थिति में, आपके setup.py को numpy आयात करने की आवश्यकता है, जो एक त्रुटि उत्पन्न करेगा यदि आप pip install को बिना pip install numpy किए बिना अपने प्रोजेक्ट को pip install करने का प्रयास करते हैं।

यदि आपकी प्रोजेक्ट numpy पर निर्भर करती है, और आप निर्भरता के रूप में स्वचालित रूप से स्थापित होना चाहते हैं, तो आपको केवल एक्सटेंशन_डीआईआर सेट करना होगा जब आपके एक्सटेंशन वास्तव में बनाए जा रहे हों। आप build_ext subclassing द्वारा ऐसा कर सकते हैं:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

class CustomBuildExtCommand(build_ext):
    """build_ext command for use when numpy headers are needed."""
    def run(self):

        # Import numpy here, only when headers are needed
        import numpy

        # Add numpy headers to include_dirs
        self.include_dirs.append(numpy.get_include())

        # Call original build_ext command
        build_ext.run(self)

ext_modules = [Extension("hello", ["hello.pyx"])]

setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': CustomBuildExtCommand},
  install_requires=['numpy'],
  ext_modules = ext_modules
)

और आप स्वचालित रूप से स्थापित निर्भरता के रूप में साइथन जोड़ने के लिए एक समान चाल का उपयोग कर सकते हैं:

from distutils.core import setup
from distutils.extension import Extension

try:
    from Cython.setuptools import build_ext
except:
    # If we couldn't import Cython, use the normal setuptools
    # and look for a pre-compiled .c file instead of a .pyx file
    from setuptools.command.build_ext import build_ext
    ext_modules = [Extension("hello", ["hello.c"])]
else:
    # If we successfully imported Cython, look for a .pyx file
    ext_modules = [Extension("hello", ["hello.pyx"])]

class CustomBuildExtCommand(build_ext):
    """build_ext command for use when numpy headers are needed."""
    def run(self):

        # Import numpy here, only when headers are needed
        import numpy

        # Add numpy headers to include_dirs
        self.include_dirs.append(numpy.get_include())

        # Call original build_ext command
        build_ext.run(self)

setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': CustomBuildExtCommand},
  install_requires=['cython', 'numpy'],
  ext_modules = ext_modules
)

नोट: ये दृष्टिकोण केवल pip install . साथ काम करते हैं pip install . । वे python setup.py install या python setup.py develop लिए काम नहीं करेंगे क्योंकि इन आदेशों में आपके प्रोजेक्ट के बाद निर्भरताएं स्थापित की जाएंगी।