यदि मैं CreateUser.py
मुख्य user_management निर्देशिका में जाता हूं, तो मैं आसानी से उपयोग कर सकता हूं: import Modules.LDAPManager
आयात करने के लिए LDAPManager.py
--- यह काम करता है।
कृपया, नहीं । इस तरह से LDAPManager
उपयोग किया जाने वाला मॉड्यूल अन्य आयातों के माध्यम से आयातित के समान नहींCreateUser
होगा । यह समस्या पैदा कर सकता है जब आपके पास मॉड्यूल में कुछ वैश्विक स्थिति होती है या अचार / अनपिकलिंग के दौरान। आयात से बचें जो केवल इसलिए काम करते हैं क्योंकि मॉड्यूल उसी निर्देशिका में होता है।
जब आपके पास एक पैकेज संरचना होती है, तो आपको चाहिए:
रिश्तेदार के आयात का प्रयोग करें, यानी अगर CreateUser.py
में है Scripts/
:
from ..Modules import LDAPManager
ध्यान दें कि यह PEP 8 द्वारा हतोत्साहित किया गया था (केवल पिछले तनाव को नोट करें ) क्योंकि अजगर के पुराने संस्करण उन्हें बहुत अच्छी तरह से समर्थन नहीं करते थे, लेकिन यह समस्या वर्षों पहले हल हो गई थी। वर्तमान पीईपी 8 के संस्करण है पूर्ण आयात के लिए एक स्वीकार्य विकल्प के रूप में उन्हें सुझाव देते हैं। मैं वास्तव में उन्हें पैकेज के अंदर पसंद करता हूं।
संपूर्ण पैकेज नाम ( CreateUser.py
इन Scripts/
) का उपयोग करके पूर्ण आयात का उपयोग करें :
from user_management.Modules import LDAPManager
दूसरा काम करने के लिए पैकेज user_management
को अंदर स्थापित किया जाना चाहिए PYTHONPATH
। विकास के दौरान आप आईडीई को कॉन्फ़िगर कर सकते हैं ताकि ऐसा न हो, बिना किसी कॉल को मैन्युअल रूप से जोड़ने के sys.path.append
।
इसके अलावा, मुझे यह अजीब लगता Scripts/
है कि यह एक सबपैकेज है। क्योंकि एक वास्तविक इंस्टॉलेशन में user_management
मॉड्यूल को डायरेक्टरी site-packages
में पाया गया lib/
(जो भी आपके ओएस में लाइब्रेरी स्थापित करने के लिए उपयोग किया जाता है) के तहत इंस्टॉल किया जाएगा, जबकि स्क्रिप्ट्स को एक bin/
डायरेक्टरी के तहत इंस्टॉल किया जाना चाहिए (जो भी आपके ओएस के लिए निष्पादन योग्य हैं)।
वास्तव में मुझे विश्वास है Script/
तहत भी नहीं होना चाहिए user_management
। यह उसी स्तर पर होना चाहिए user_management
। इस तरह से आपको उपयोग नहीं करना है -m
, लेकिन आपको बस यह सुनिश्चित करना है कि पैकेज मिल सकता है (यह फिर से आईडीई को कॉन्फ़िगर करने, पैकेज को सही ढंग से स्थापित करने या PYTHONPATH=. python Scripts/CreateUser.py
सही पथ के साथ स्क्रिप्ट लॉन्च करने के लिए उपयोग करने का मामला है )।
सारांश में, मैं जिस पदानुक्रम का उपयोग करेगा वह है:
user_management (package)
|
|------- __init__.py
|
|------- Modules/
| |
| |----- __init__.py
| |----- LDAPManager.py
| |----- PasswordManager.py
|
Scripts/ (*not* a package)
|
|----- CreateUser.py
|----- FindUser.py
तब कोड CreateUser.py
और FindUser.py
मॉड्यूल आयात करने के लिए पूर्ण आयात का उपयोग करना चाहिए:
from user_management.Modules import LDAPManager
स्थापना के दौरान आप यह सुनिश्चित करते हैं कि निष्पादन के लिए निर्देशिका के अंदर और स्क्रिप्ट्स user_management
कहीं न कहीं समाप्त हो जाती हैं PYTHONPATH
ताकि वे मॉड्यूल खोजने में सक्षम हों। विकास के दौरान आप या तो आईडीई कॉन्फ़िगरेशन पर निर्भर होते हैं, या आप मूल निर्देशिका को CreateUser.py
जोड़ते हैंScripts/
PYTHONPATH
(मेरा मतलब उस निर्देशिका से है जिसमें दोनों शामिल हैं user_management
और Scripts
):
PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py
या आप PYTHONPATH
विश्व स्तर पर संशोधित कर सकते हैं ताकि आपको हर बार यह निर्दिष्ट न करना पड़े। यूनिक्स OSes (linux, Mac OS X आदि) पर आप PYTHONPATH
बाहरी चर को परिभाषित करने के लिए शेल स्क्रिप्ट में से एक को संशोधित कर सकते हैं , विंडोज पर आपको पर्यावरणीय चर सेटिंग्स को बदलना होगा।
परिशिष्ट मेरा मानना है कि, अगर आप को Python2 उपयोग कर रहे हैं, यह सुनिश्चित डालकर निहित रिश्तेदार आयात से बचने के लिए बनाने के लिए बेहतर है:
from __future__ import absolute_import
अपने मॉड्यूल के शीर्ष पर। इस तरह import X
हमेशा toplevel मॉड्यूल आयात करने का मतलब है X
और X.py
उसी निर्देशिका (यदि वह निर्देशिका में नहीं है PYTHONPATH
) में फ़ाइल आयात करने का प्रयास नहीं करेगा । इस तरह एक रिश्तेदार आयात करने का एकमात्र तरीका स्पष्ट वाक्यविन्यास ( ए) का उपयोग करना हैfrom . import X
) , जो बेहतर है ( स्पष्ट रूप से निहित से बेहतर है )।
यह सुनिश्चित करेगा कि आप कभी भी "फर्जी" निहित रिश्तेदार आयात का उपयोग न करें, क्योंकि ये ImportError
स्पष्ट रूप से संकेत देंगे कि कुछ गलत है। अन्यथा आप एक मॉड्यूल का उपयोग कर सकते हैं जो कि आपको नहीं लगता कि यह है।
python -m user_management.Scripts.CreateUser