2011-05-29 13 views
7

बनाने के लिए साइथन का उपयोग कैसे करें मेरे पास एक पायथन स्क्रिप्ट है, मैंने स्क्रिप्ट को .pyx फ़ाइल में बदल दिया है। मैं इस कोड को एक स्टैंड डीएलएल फ़ाइल में संकलित करना चाहता हूं।स्टैंड डीएल

मैंने this document में देखा कि साइथन एक डीएलएल फ़ाइल बनाएगा, लेकिन मुझे केवल एक पाइड मिलता है।

मैं MinGW है और स्क्रिप्ट मेरे कोड (सिर्फ एक हैलो दुनिया) को संकलित करने के आदेश python setup.py build --compiler=mingw32 इस्तेमाल करने की कोशिश:

def init(): 
    return "hello world" 

कोई भी विचार? धन्यवाद

+2

यह वही है Cython के लिए है नहीं है। यह एक पायथन बोली में सीपीथन एक्सटेंशन लिखने के लिए है जो निम्न स्तर के स्थैतिक रूप से टाइप किए गए कोड को लिखने के लिए उपयोग किया जा सकता है जिसे पाइथन के साथ मिलकर काम करना है। पाइथन कोड को किसी ऐसे रूप में परिवर्तित करने के लिए नहीं जिसे असंबंधित कोड से जोड़ा जा सके (उदा। सी प्रोग्राम जो सीपीथन के बारे में नहीं जानते)। – delnan

उत्तर

3

तो पहली बात यह है कि फ़ाइल को helloworld.pyx पर पुनर्नामित करें। अब हमें को setup.py बनाना है, जो पायथन मेकफ़ाइल (अधिक जानकारी संकलन देखें) के लिए है। आपका setup.py दिखना चाहिए:

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

from Cython.Distutils import build_ext 
    setup(
     cmdclass = {'build_ext': build_ext}, 
     ext_modules = [Extension("helloworld", 
    ["helloworld.pyx"])]) 

इस का उपयोग करने के लिए अपने Cython फ़ाइल कमांडलाइन विकल्पों का उपयोग निर्माण करने के लिए:

$ python setup.py build_ext --inplace 

कौन सा अपने स्थानीय निर्देशिका कहा जाता HelloWorld में एक फ़ाइल को छोड़ देगा। इसलिए विंडोज़ में यूनिक्स या helloworld.dll में।

अब उपयोग इस फ़ाइल की: शुरू अजगर दुभाषिया और बस इसे आयात के रूप में अगर यह एक नियमित रूप से अजगर मॉड्यूल था:

+0

धन्यवाद। मैं xp sp3 में आपके जैसा ही करता हूं। लेकिन मुझे helloworld.dll नहीं मिल सकता है, लेकिन एक helloword.pyd है, और एक बिल्ड फ़ोल्डर है।यह मैं जानना चाहता हूं कि – ljx0517

+0

[पायथन = डीएलएल पायथन कार्यों के साथ] क्यों नहीं भरता है (http://stackoverflow.com/a/11797037/819417) –

3

Is a *.pyd file the same as a DLL?

हाँ, .pyd फाइलों dll के हैं, लेकिन कुछ मतभेद हैं। यदि आप में एक डीएलएल है जिसका नाम foo.pyd है, तो उसके पास PyInit_foo() फ़ंक्शन होना चाहिए। फिर आप पाइथन "आयात foo" लिख सकते हैं, और पायथन foo.pyd (साथ ही foo.py, foo.pyc) की खोज करेगा और यदि इसे पाता है, तो को PyInit_foo() को प्रारंभ करने के लिए कॉल करने का प्रयास करेगा। आप 0xfoo.lib के साथ अपने .exe को लिंक नहीं करते हैं, क्योंकि इससे विंडोज़ को डीएलएल मौजूद होने की आवश्यकता होती है।

ध्यान दें कि foo.pyd के लिए खोज पथ PYTHONPATH है, जैसा कि Windows foo.dll की खोज करने के लिए उपयोग करता है। साथ ही, foo.pyd को अपने प्रोग्राम को चलाने के लिए मौजूद नहीं होना चाहिए, जबकि यदि आपने अपने प्रोग्राम को एक डीएलएल से जोड़ा है, तो डीएलएल आवश्यक है। बेशक, अगर आप import foo कहना चाहते हैं तो foo.pyd आवश्यक है। एक डीएलएल में, __declspec(dllexport) के साथ स्रोत कोड में लिंकेज घोषित किया गया है। एक .pyd में, लिंक को उपलब्ध कार्यों की सूची में परिभाषित किया गया है।

Modifying Python’s Search Path, Absolute and Relative Imports