পাইথন: প্রকল্প স্তরক্রমের একই স্তরে অন্য ডিরেক্টরি থেকে আমদানি মডিউল


89

আমি সব ধরণের উদাহরণ এবং অন্যান্য অনুরূপ প্রশ্ন দেখেছি, তবে আমি আমার দৃশ্যের সাথে মেলে এমন কোনও উদাহরণ খুঁজে পাচ্ছি না। আমি এই মত জিজ্ঞাসা করা একটি সম্পূর্ণ গুন্ডা মত মনে হয় কারণ অনেক অনুরূপ প্রশ্ন আছে, কিন্তু আমি ঠিক এই কাজ "সঠিকভাবে" পেতে পারে বলে মনে হয় না। আমার প্রকল্পটি এখানে:

user_management  (package)
        |
        |------- __init__.py
        |
        |------- Modules/
        |           |
        |           |----- __init__.py
        |           |----- LDAPManager.py
        |           |----- PasswordManager.py
        |
        |------- Scripts/
        |           |
        |           |----- __init__.py
        |           |----- CreateUser.py
        |           |----- FindUser.py

যদি আমি "ব্যবহারকারীর.পি "টিকে প্রধান ব্যবহারকারীর পরিচালন ডিরেক্টরিতে স্থানান্তর করি তবে আমি সহজেই ব্যবহার করতে পারি: "import Modules.LDAPManager"এলডিএপিএমএনেজ.আরপি আমদানি করতে --- এটি কাজ করে। আমি যা করতে পারি না (যা আমি করতে চাই) তা হ'ল ক্রিয়েটস ইউজার.পি স্ক্রিপ্টস সাবফোল্ডারটিতে রাখুন এবং এলডিএপিএমনেজ.আরপি আমদানি করুন। আমি ব্যবহার করে এটি সম্পাদন আশা করি "import user_management.Modules.LDAPManager.py"। এটি কাজ করে না। সংক্ষেপে, পাইথন ফাইলগুলি হায়ারার্কিতে আরও গভীরভাবে দেখার জন্য আমি পেতে পারি তবে আমি একটি ডিরেক্টরিতে এবং অন্যটিতে রেফারেন্স দেওয়ার জন্য পাইথন স্ক্রিপ্ট পেতে পারি না।

নোট করুন যে আমি ব্যবহার করে আমার সমস্যার সমাধান করতে সক্ষম:

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import Modules.LDAPManager as LDAPManager

আমি শুনেছি এটি খারাপ অভ্যাস এবং নিরুৎসাহিত।

স্ক্রিপ্টগুলিতে ফাইলগুলি সরাসরি মৃত্যুদন্ড কার্যকর করার উদ্দেশ্যে করা হয় ( স্ক্রিপ্টগুলিতে init .py কি প্রয়োজনীয়?)। আমি পড়েছি যে এই ক্ষেত্রে, আমার -m পতাকা সহ ক্রিয়েটিউজার.পি চালানো উচিত। আমি এটিতে কিছু বৈকল্পিক চেষ্টা করেছি এবং LDAPManager.py স্বীকৃতি দেওয়ার জন্য MakeUser.py পেতে পারে বলে মনে হচ্ছে না।

উত্তর:


67

আমি যদি CreateUser.pyপ্রধান ব্যবহারকারী_ পরিচালন ডিরেক্টরিতে চলে যাই তবে আমি সহজেই ব্যবহার করতে পারি: import Modules.LDAPManagerআমদানি করতে LDAPManager.py --- এটি কাজ করে।

দয়া করে, না । এইভাবে LDAPManagerব্যবহৃত মডিউলটি অন্যান্য আমদানির মাধ্যমে আমদানিকৃতর মতো CreateUserহবে না । মডিউলে বা পিকিং / আন-পিকিংয়ের সময় আপনার কিছু বিশ্বব্যাপী অবস্থা থাকলে এটি সমস্যা তৈরি করতে পারে। মডিউলটি একই ডিরেক্টরিতে ঘটে বলে কেবল কাজ করে এমন আমদানি এড়িয়ে চলুন

আপনার যদি প্যাকেজ কাঠামো থাকে তবে আপনার উচিত:

  • আপেক্ষিক আমদানি ব্যবহার করুন, যদি হয় CreateUser.pyতবে Scripts/:

     from ..Modules import LDAPManager
    

    নোট করুন যে এটি ( অতীত কালটি নোট করুন ) পিইপি 8 দ্বারা নিরুৎসাহিত হয়েছিল কেবল কারণ পাইথনের পুরানো সংস্করণগুলি সেগুলি খুব ভালভাবে সমর্থন করে না, তবে এই সমস্যাটি বহু বছর আগেই সমাধান হয়েছিল। বর্তমান PEP 8 সংস্করণ নেই পরম আমদানির একটা গ্রহণযোগ্য বিকল্প হিসেবে তাদের সুপারিশ। আমি আসলে তাদের প্যাকেজগুলির মধ্যে পছন্দ করি।

  • পুরো প্যাকেজ নামটি ব্যবহার করে নিখুঁত আমদানি ব্যবহার করুন ( CreateUser.pyইন Scripts/):

     from user_management.Modules import LDAPManager
    

দ্বিতীয়টির কাজ করার জন্য প্যাকেজটি user_managementভিতরে থাকা উচিত PYTHONPATH। বিকাশের সময় আপনি আইডিই কনফিগার করতে পারেন যাতে ম্যানুয়ালি sys.path.appendকোথাও কল যুক্ত না করে এটি ঘটে ।

এছাড়াও আমি এটি অদ্ভুত বলে মনে করি এটি Scripts/একটি সাবপ্যাকেজ। একটি বাস্তব ইনস্টলেশন কারণ user_managementমডিউল অধীনে স্থাপন করা হবে site-packagesপাওয়া lib/ডিরেক্টরি (যেটা আপনার সিস্টেমের OS এ লাইব্রেরি ইনস্টল করার জন্য ব্যবহৃত হয়), স্ক্রিপ্ট একটি অধীনে ইনস্টল করা উচিত যখনbin/ ডিরেক্টরি (যেটা আপনার OS জন্য এক্সেকিউটেবল রয়েছে)।

আসলে আমি বিশ্বাস করি 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_managementScripts):

PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py

অথবা আপনি PYTHONPATHবিশ্বব্যাপী পরিবর্তন করতে পারেন যাতে প্রতিবার এটি নির্দিষ্ট করতে না হয়। ইউনিক্স ওএসে (লিনাক্স, ম্যাক ওএস এক্স ইত্যাদি) আপনি PYTHONPATHবাহ্যিক ভেরিয়েবল সংজ্ঞায়িত করতে শেল স্ক্রিপ্টগুলির একটি পরিবর্তন করতে পারেন , উইন্ডোজে আপনাকে পরিবেশগত পরিবর্তনশীল সেটিংস পরিবর্তন করতে হবে।


অ্যাডেন্ডাম আমি বিশ্বাস করি, আপনি যদি পাইথন 2 ব্যবহার করেন তবে এটি প্রয়োগ করে অন্তর্নিহিত আপেক্ষিক আমদানি এড়ানো নিশ্চিত করা আরও ভাল:

from __future__ import absolute_import

আপনার মডিউলগুলির শীর্ষে। এইভাবে import X সর্বদা শীর্ষস্থানীয় মডিউলটি আমদানি করার অর্থ Xএবং কখনও X.pyএকই ডিরেক্টরিতে থাকা ফাইলটি আমদানির চেষ্টা করবে না (যদি ডিরেক্টরিটি সেই ডিরেক্টরিতে না থাকে PYTHONPATH)। এইভাবে আপেক্ষিক আমদানি করার একমাত্র উপায় হ'ল সুস্পষ্ট সিনট্যাক্স (দ্য from . import X) ব্যবহার করা, যা ভাল ( স্পষ্টকৃতের চেয়ে স্পষ্টতই ভাল )।

এটি নিশ্চিত করবে যে আপনি কখনই "বোগাস" অন্তর্নিহিত আপেক্ষিক আমদানি ব্যবহার করবেন না, যেহেতু এগুলি ImportErrorস্পষ্টভাবে ইঙ্গিত দেয় যে কোনও কিছু ভুল। অন্যথায় আপনি এমন একটি মডিউল ব্যবহার করতে পারেন যা এটি আপনার মনে হয়।


আপনি যদি আপেক্ষিক আমদানিগুলি ব্যবহার করেন তবে আপনার কার্যকর করা উচিতpython -m user_management.Scripts.CreateUser
mononoke

14

পাইথন 2.5 থেকে, আপনি ব্যবহার করতে পারেন

from ..Modules import LDAPManager

নেতৃস্থানীয় সময় আপনাকে আপনার উত্তরাধিকারী স্তর হিসাবে "উপরে" নিয়ে যায় takes

আমদানির জন্য আন্তঃ-প্যাকেজ রেফারেন্সে পাইথন ডক্স দেখুন ।


3

"রুট" এ __init__.pyআপনি একটিও করতে পারেন

import sys
sys.path.insert(1, '.')

যা উভয় মডিউল আমদানিযোগ্য করা উচিত।


0

আমি একই সমস্যার মুখোমুখি হয়েছি। এটি সমাধান করার জন্য, আমি ব্যবহার করেছি export PYTHONPATH="$PWD"। তবে, Scriptsএক্ষেত্রে আপনাকে নীচের উপর নির্ভর করে আপনার dir এর আমদানি পরিবর্তন করতে হবে :

কেস 1: আপনি user_managementদিরের মধ্যে থাকলে আপনার মডিউলটি আমদানি scriptsকরতে এই স্টাইলটি ব্যবহার করা উচিত from Modules import LDAPManager

কেস 2: আপনি যদি user_management1 টি স্তরের মতো হন তবে মডিউলগুলি আমদানি করতে mainআপনার scriptsএই স্টাইলটি ব্যবহার করা উচিত from user_management.Modules import LDAPManager

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.