2012-07-16 22 views
12

मेरे पास कई पायथन मॉड्यूल (पैकेज में व्यवस्थित) हैं, जो एक दूसरे पर निर्भर करते हैं। जैसेसाइथन का उपयोग करके एकाधिक पायथन मॉड्यूल (या पैकेज) को संकलित और लिंक कैसे करें?

  • Module1
  • Module2: आयात करता है Module1
  • Module3
  • Module4: आयात Module3, 2 मॉड्यूल, मॉड्यूल 1

मान लेते हैं अनुप्रयोगों के विकास के लिए प्रासंगिक इंटरफ़ेस Module4 और मैं में है चलो साइथन का उपयोग कर मॉड्यूल 4.so उत्पन्न करना चाहते हैं। यदि मैं निष्पक्ष तरीके से आगे बढ़ता हूं, तो मुझे एक विस्तार Module4 मिलता है। इसलिए मैं आयात कर सकता हूं लेकिन एक्सटेंशन मॉड्यूल 1, मॉड्यूल 2, मॉड्यूल 3 के पाइथन स्रोत कोड पर निर्भर करता है।

क्या संकलन करने का कोई तरीका है ताकि मॉड्यूल 1, मॉड्यूल 2, मॉड्यूल 3 संकलित और को मॉड्यूल 4 से लिंक किया गया हो? मैं मैन्युअल रूप से, सब कुछ करने से बचाना चाहता हूं पहले मॉड्यूल 1 को संकलित करें। तो मॉड्यूल 2 में आयात घोषणा बदलें, ताकि मॉड्यूल 1.py के बजाय मॉड्यूल 1.so आयात करने के लिए, मॉड्यूल 2 को मॉड्यूल 2.so में संकलित करें और इसी तरह ....

धन्यवाद!

उत्तर

9

संपादित करें। पहले दो विकल्प साइथन के विशिष्ट कोड को संदर्भित करते हैं, जो मैंने याद किया है वह यह है कि प्रश्न शुद्ध पायथन मॉड्यूल के बारे में है, इसलिए विकल्प 3 समाधान है।

1. इस "कैसे एक पैकेज में मॉड्यूल के एक पदानुक्रम बनाने के लिए" देखें:: https://github.com/cython/cython/wiki/PackageHierarchy

2. मैं "शामिल हैं" बयान पसंद करते हैं:

कुछ ही विकल्प हैं http://docs.cython.org/src/userguide/language_basics.html#the-include-statement मेरे पास कई .pyx फ़ाइलें हैं और वे सभी main.pyx में शामिल हैं, यह सब एक नामस्थान में है। देखते हैं -

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)] 
) 

4. एक अधिक कुशल संकलन: http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3. आप एक से अधिक "विस्तार" जोड़कर एक बार सेटअप का उपयोग पर अपने सभी मॉड्यूल संकलन कर सकते हैं: परिणाम एक बड़ा मॉड्यूल है here

setup (
    name = 'MyProject', 
    ext_modules = cythonize(["*.pyx"]), 
) 
+0

धन्यवाद, इसलिए विकल्प 3 मॉड्यूल 3.py के बजाय स्वचालित रूप से मॉड्यूल 3 आयात करने की देखभाल करेगा (मैं ऊपर दिए गए उदाहरण का जिक्र कर रहा हूं)? – Mannaggia

+0

@ मन्नगिया, आह, अब मैं देखता हूं कि आप साइथन विशिष्ट विशेषताओं ("पीईएक्स" फाइलों) का उपयोग नहीं करते हैं, आप केवल सिथन का उपयोग करके सामान्य पायथन मॉड्यूल को संकलित करना चाहते हैं। हां, एक कथन "आयात मॉड्यूल 1" "मॉड्यूल 1.py" या "मॉड्यूल 1.so" आयात करने के लिए काम करता है - बस दोनों फाइलों को एक ही निर्देशिका में न रखें क्योंकि मुझे नहीं पता कि कौन सा मॉड्यूल आयात किया जाएगा। कुछ भी नहीं बदलता है, इसलिए आयात करते समय भी .py फ़ाइल की तरह व्यवहार किया जाता है। –

+1

@ मन्नगजिआ, कुछ भी नहीं बदलता है, इसलिए आयात करते समय भी .py फ़ाइल की तरह व्यवहार किया जाता है। आपके द्वारा संकलित किए जाने के बाद .py मॉड्यूल। इसलिए सब कुछ बॉक्स से बाहर काम करना चाहिए। –