मुझे अजगर के बारे में अनुभव नहीं है, इसलिए यदि मेरे शब्दों में कोई गलत है, तो मुझे बताएं। यदि आपकी फ़ाइल पदानुक्रम इस तरह व्यवस्थित है:
project\
module_1.py
module_2.py
module_1.py
एक समारोह में कहा जाता को परिभाषित करता है func_1()
, module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
और आप python module_2.py
cmd में चलते हैं , यह वही करेगा जो func_1()
परिभाषित करता है। आमतौर पर हम समान पदानुक्रम फ़ाइलों को आयात करते हैं। लेकिन जब आप लिखते from .module_1 import func_1
हैं module_2.py
, तो अजगर दुभाषिया कहेगा No module named '__main__.module_1'; '__main__' is not a package
। तो इसे ठीक करने के लिए, हम बस हमारे द्वारा किए गए बदलाव को जारी रखते हैं, और दोनों मॉड्यूल को एक पैकेज में स्थानांतरित करते हैं, और चलाने के लिए एक कॉलर के रूप में तीसरा मॉड्यूल बनाते हैं module_2.py
।
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
लेकिन कारण है कि हम एक जोड़ने .
से पहले module_1
में module_2.py
है कि अगर हम चाहते हैं कि और रन नहीं करते है main.py
, अजगर दुभाषिया कहेंगे No module named 'module_1'
, कि एक छोटे से मुश्किल है, module_1.py
ठीक बगल है module_2.py
। अब मैं कुछ करने func_1()
देता module_1.py
हूँ:
def func_1():
print(__name__)
वह __name__
रिकॉर्ड जो func_1 को कॉल करता है। अब हम .
पहले वाले को रखते हैं module_1
, चलाते हैं main.py
, छापेंगे package_1.module_1
, नहीं module_1
। यह इंगित करता है कि जो कॉल करता func_1()
है, वह उसी पदानुक्रम पर है main.py
, जो .
कि module_1
उसी पदानुक्रम पर है जो module_2.py
स्वयं के रूप में है। इसलिए यदि कोई बिंदी नहीं है, तो उसी पदानुक्रम को स्वयं के रूप में main.py
पहचान लेगा module_1
, यह पहचान सकता है package_1
, लेकिन इसे "अंडर" नहीं।
अब इसे थोड़ा जटिल बनाते हैं। आपके पास एक config.ini
मॉड्यूल है और एक फ़ंक्शन को उसी पदानुक्रम में 'main.py' के रूप में पढ़ने के लिए परिभाषित करता है।
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
और किसी अपरिहार्य कारण के लिए, आपको इसे कॉल करना होगा module_2.py
, इसलिए इसे ऊपरी पदानुक्रम से आयात करना होगा। मॉड्यूल_2 थिंकपैड :
import ..config
pass
दो डॉट्स का मतलब है ऊपरी पदानुक्रम (तीन डॉट्स ऊपरी से ऊपरी तक पहुंच, और इसी तरह) से आयात। अब हम चलाते हैं main.py
, दुभाषिया कहेंगे ValueError:attempted relative import beyond top-level package
:। यहाँ पर "शीर्ष-स्तरीय पैकेज" है main.py
। बस क्योंकि config.py
बगल में है main.py
, वे एक ही पदानुक्रम में हैं, config.py
"अंडर" नहीं है main.py
, या यह "लीड" नहीं है main.py
, इसलिए यह परे है main.py
। इसे ठीक करने के लिए, सबसे सरल तरीका है:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
मुझे लगता है कि यह प्रोजेक्ट फाइल पदानुक्रम के सिद्धांत के साथ मेल खाता है, आपको अलग-अलग फ़ोल्डरों में अलग-अलग फ़ंक्शन के साथ मॉड्यूल की व्यवस्था करनी चाहिए, और बस बाहर में एक शीर्ष कॉलर छोड़ दें, और आप कभी भी कैसे चाहें आयात कर सकते हैं।