2009-01-12 19 views
54

पैकेज के अंदर रहने वाले मॉड्यूल में, मुझे उस पैकेज के __init__.py के भीतर परिभाषित फ़ंक्शन का उपयोग करने की आवश्यकता है। मैं पैकेज के भीतर मौजूद मॉड्यूल के भीतर पैकेज कैसे आयात कर सकता हूं, इसलिए मैं उस फ़ंक्शन का उपयोग कर सकता हूं?पायथन: युक्त पैकेज आयात करें

मॉड्यूल के अंदर का आयात __init__ पैकेज आयात नहीं करेगा, लेकिन इसके बजाय एक मॉड्यूल __init__ नाम है, अलग-अलग नामों के साथ बातें की दो प्रतियां के लिए अग्रणी ...

वहाँ यह करने के लिए एक pythonic तरीका है?

उत्तर

21

यह आपके प्रश्न का बिल्कुल जवाब नहीं देता है, लेकिन मैं सुझाव दे रहा हूं कि आप __init__.py फ़ाइल के बाहर फ़ंक्शन को उस पैकेज के अंदर और दूसरे मॉड्यूल में ले जाएं। फिर आप उस फ़ंक्शन को अपने अन्य मॉड्यूल में आसानी से आयात कर सकते हैं। यदि आप चाहते हैं, तो आपके पास __init__.py फ़ाइल में एक आयात कथन हो सकता है जो उस फ़ंक्शन को आयात करेगा (जब पैकेज आयात किया जाता है)।

+1

मुझे एहसास है कि मैं यह कर सकता हूं, यह सिर्फ बदसूरत और उम, अवांछित लगता है। –

+4

यह सुनिश्चित नहीं है कि यह 'unpythonic' कैसे है? विकल्प वैकल्पिक रूप से और अधिक गन्दा नहीं होगा, क्योंकि __init__.py वास्तव में एक मॉड्यूल नहीं है? –

+15

+1 - आपके पैकेज में 'common.py' का उपयोग करके पायथन में बहुत सामान्य अभ्यास है। – cdleary

5

पैकेज testmod नाम पर है तो और इसलिए अपने init फ़ाइल testmod/__init__.py है और पैकेज के भीतर अपने मॉड्यूल submod.py फ़ाइल के भीतर से तो submod.py है, तो आप सिर्फ import testmod और उपयोग जो कुछ भी आप चाहते हैं कि testmod में परिभाषित किया गया है कहने के लिए सक्षम होना चाहिए।

1

मैं पूरी तरह यकीन है कि क्या स्थिति है नहीं कर रहा हूँ, लेकिन यह अपने "अलग नाम" समस्या का समाधान हो सकता है:

import __init__ as top 
top.some_function() 

या हो सकता है ?:

from __init__ import some_function 
some_function() 
+3

कोई बेहतर तरीका नहीं मिला है, यह काम करता है, लेकिन कम से कम cPython 2.7 में दुभाषिया '__init__' मानता है 'शीर्ष' से भिन्न मॉड्यूल, और इसलिए '__init __। py' फ़ाइल दो बार लोड हो जाती है। – dimo414

+2

यह एक अंतर्निहित रिश्तेदार आयात है, और जैसे कि पाइथन 3 में काम नहीं करेगा, और फिर भी अजगर 2 में खराब अभ्यास है। – habnabit

+1

यह अभी भी 'sys.modules ['__ init __'] बनाता है। असल में, '__init __। Py' मॉड्यूल * को सीधे आयात नहीं किया जाना चाहिए *। इसके बजाय पैकेज (निर्देशिका नाम) आयात करें। –

42
इसके अलावा

, अजगर 2.5 में शुरू , सापेक्ष आयात संभव है। उदाहरण के लिए:

from . import foo 

http://docs.python.org/tutorial/modules.html#intra-package-references से हवाला देते हुए: उपरोक्त वर्णित निहित रिश्तेदार आयात के लिए


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

from . import echo 
from .. import formats 
from ..filters import equalizer 
+0

यह '__init __। Py' से आयात करने के तरीके के उत्तर का उत्तर नहीं देता है। – BrenBarn

+1

@ ब्रेनबर्न: अभी तक इसे आयात करने का तरीका है; जब आप * पैकेज * आयात करते हैं, तो '__init __। py' फ़ाइल प्रभावी नामस्थान के रूप में कार्य करती है। आपको सीधे '__init __। Py' आयात नहीं करना चाहिए। –

1

Django में, फ़ाइल manage.py from django.core.management import execute_manager है, लेकिन execute_manager एक मॉड्यूल नहीं है। यह निर्देशिका के __init__.py मॉड्यूल के भीतर एक फ़ंक्शन है।

संबंधित मुद्दे