পাইথনে আপেক্ষিক পথ থেকে আমদানি


114

আমার ক্লায়েন্ট কোডের জন্য আমার ফোল্ডার, আমার সার্ভার কোডের জন্য একটি ফোল্ডার এবং কোডগুলির জন্য একটি ফোল্ডার রয়েছে যা তাদের মধ্যে ভাগ করা আছে

Proj/
    Client/
        Client.py
    Server/
        Server.py
    Common/
        __init__.py
        Common.py

সার্ভার.পি এবং ক্লায়েন্ট.পি থেকে আমি কীভাবে কমন.পিটি আমদানি করব?


সম্পর্কিত: stackoverflow.com/q/72852/1025391
moooeeeep

উত্তর:


151

সম্পাদনা নভেম্বর 2014 (3 বছর পরে):

পাইথন ২.6 এবং ৩.x যথাযথ আপেক্ষিক আমদানি সমর্থন করে, যেখানে আপনি কোনও হ্যাকিং এড়াতে পারবেন। এই পদ্ধতির সাহায্যে আপনি জানেন যে আপনি নিখুঁত আমদানির চেয়ে আপেক্ষিক আমদানি করছেন। '..' এর অর্থ, আমার উপরের ডিরেক্টরিতে যান:

from ..Common import Common

ক্যাভিয়েট হিসাবে, এটি কেবল তখনই কাজ করবে যদি আপনি প্যাকেজের বাইরে থেকে মডিউল হিসাবে অজগরটি চালান । উদাহরণ স্বরূপ:

python -m Proj

আসল হ্যাকি উপায়

এই পদ্ধতিটি এখনও কিছু পরিস্থিতিতে সাধারণত ব্যবহৃত হয়, যেখানে আপনি নিজের প্যাকেজটি কখনও 'ইনস্টল' করেন না। উদাহরণস্বরূপ, এটি জাঙ্গো ব্যবহারকারীদের কাছে জনপ্রিয়।

আপনি কমন / আপনার সিএস.পথে যোগ করতে পারেন (জিনিসগুলি আমদানি করার জন্য পাইথনের পাথগুলির তালিকা):

import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common

os.path.dirname(__file__) কেবলমাত্র আপনার বর্তমান পাইথন ফাইলের ডিরেক্টরি আপনাকে দেয় এবং তারপরে আমরা 'কমন /' ডিরেক্টরিতে নেভিগেট করি এবং 'সাধারণ' মডিউলটি আমদানি করি।


4
পাইথন মডিউলগুলি ম্যানুয়ালি পাথটি সংশোধন করবেন না, কেবল দ্রুত হ্যাকের জন্যই হতে পারে। ডিস্টুয়েলস, সেটআপটুলস ইত্যাদি ব্যবহার করে পাইথন প্যাকেজ পরিচালনা শেখা সাধারণত প্রয়োজনীয় দক্ষতা যা এই জাতীয় সমস্যার সমাধান করবে।
স্যাশা গটফ্রাইড

4
@ স্যাশাগোটফ্রিড সম্পূর্ণরূপে একমত, যদিও আপনি যদি বিতরণযোগ্য প্যাকেজ তৈরি না করে থাকেন তবে তাতে কিছু আসে যায় না। উদাহরণস্বরূপ, জাজানগোতে আপনি কখনই ডিপুটিলেটগুলি সহ আপনার অ্যাপ্লিকেশনটি ইনস্টল করেন না, তাই উপরের পদ্ধতিটি একটি সহজ হ্যাক। তবে যাই হোক আমি এই দিনগুলিতে কী করব তা দিয়ে উত্তর সম্পাদনা করেছি।
ডেভ

36
যথাযথ কৌশল সম্পর্কে প্রচারের পরিবর্তে প্রকৃত প্রশ্নের উত্তরের জন্য ধন্যবাদ। আপেক্ষিক আমদানি করার যথেষ্ট কারণ রয়েছে।
shrewmouse

আপনি কিভাবে একাধিক স্তর যেতে হবে?
jxramos

10
আরও একটি স্তর উপরে যেতে, প্রতিটি স্তরের জন্য একটি অতিরিক্ত বিন্দু ব্যবহার করুন। @ জ্যাক্স্রামোস প্রাক্তন: from ...myfileযান../../myfile
ওয়াটসআইনাবক্স

11

যথেষ্ট মজাদার, একই সমস্যার আমি সবেমাত্র পেয়েছি এবং আমি এই কাজটি নিম্নলিখিত উপায়ে পাই:

লিনাক্স কমান্ডের সাথে একত্রিত হয়ে lnআমরা জিনিসটিকে অনেক সহজ করে তুলতে পারি:

1. cd Proj/Client
2. ln -s ../Common ./

3. cd Proj/Server
4. ln -s ../Common ./

এবং, এখন আপনি যদি some_stuffফাইল থেকে আমদানি করতে চান : Proj/Common/Common.pyআপনার ফাইলে: Proj/Client/Client.pyঠিক এর মতো:

# in Proj/Client/Client.py
from Common.Common import some_stuff

এবং, একই ক্ষেত্রে প্রযোজ্য Proj/Server, এছাড়াও setup.pyপ্রক্রিয়াটির জন্য কাজ করে, একই প্রশ্ন এখানে আলোচিত , আশা করি এটি সহায়তা করে!


10

আপেক্ষিক আমদানি করবেন না।

পিইপি 8 থেকে :

আন্তঃ-প্যাকেজ আমদানির জন্য আপেক্ষিক আমদানি অত্যন্ত নিরুৎসাহিত।

আপনার সমস্ত কোডকে একটি সুপার প্যাকেজের মধ্যে রাখুন (যেমন "মাই্যাপ") এবং ক্লায়েন্ট, সার্ভার এবং সাধারণ কোডের জন্য সাবপ্যাকেজ ব্যবহার করুন।

আপডেট: " পাইথন 2.6 এবং 3.x যথাযথ আপেক্ষিক আমদানি (...) সমর্থন করে "। দেখুন ডেভ এর উত্তর আরো বিস্তারিত জানার জন্য।


4
কল্পনা করুন যে আপনি ক্লায়েন্ট এবং সার্ভারের শেষে ' if __name__ == "__main__":' 'লাইনের পরে কিছু কোড যুক্ত করেছেন । এটি হল, আপনি এগুলি একা একা স্ক্রিপ্ট হিসাবে ব্যবহার করতে সক্ষম হতে চান। কীভাবে এটি সঠিকভাবে করবেন? আমি মনে করি এটি একেবারে সাধারণ ব্যবহারের ক্ষেত্রে যা সমর্থন করা উচিত। এটা নিরুৎসাহিত করা হয় কেন?
যাব্বা

85
অবাক হচ্ছি যে, "এটা করতে না" জন্য গৃহীত উত্তর একটি "কিভাবে আমি ... না" প্রশ্ন (অবশ্য পাগল <ছ> ছাড়া।) আছে হয় এই কাজ করতে অনিয়মিত কারণে। আমি ডেভের পরামর্শ মতো একটি সমাধান ব্যবহার করি।
টম উইলসন

4
@ টমউইলসন: উত্তরটি "এটি করবেন না" এটি শুদ্ধ নয়। নীচে "এটি এইভাবে করুন" রয়েছে।
মিশা łরাজের

4
কারও কারও কাছে নিম্পির কথা বলা উচিত! তারা আপেক্ষিক আমদানির একটি টন ব্যবহার!
অস্টিন এ

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

9

আপেক্ষিক আমদানি করা সম্পূর্ণ বিস্মৃত! এখানে ছোট্ট 'ওল আমাকে কী করে:

#first change the cwd to the script path
scriptPath = os.path.realpath(os.path.dirname(sys.argv[0]))
os.chdir(scriptPath)

#append the relative location you want to import from
sys.path.append("../common")

#import your module stored in '../common'
import common.py

4
তবে আপনি আরও ভালভাবেই জানেন যে sys.argv [0] আসলে পয়েন্ট করছে - এটি অজগর শুরু করার সময় আপনি যে ডিরেক্টরিটিতে ছিলেন তা (প্রলি) নয়।
কার্ল এইচ

এটি একটি দ্রুত হ্যাক, প্রচুর সমস্যা রয়েছে lot তবে প্রশ্নটি এর চেয়ে ভালও ছিল না।
স্যাশা গটফ্রাইড

4
এটি স্পষ্টভাবে লিখিত হয়েছে, তবে ডেভের উত্তরের মূল হ্যাকটি আরও ভাল কারণ এটি __file__বর্তমান ফাইল থেকে সঠিক সম্পর্ক পেতে ব্যবহার করে
জন নিউউউস

4

ডিফল্ট আমদানি পদ্ধতিটি পাইথনপথ থেকে ইতিমধ্যে "আপেক্ষিক"। পাইথনপথটি ডিফল্টরূপে মূল সিস্টেমের ফোল্ডারের সাথে কিছু সিস্টেম লাইব্রেরিতে থাকে। আপনি যদি একটি মডিউল চালানোর জন্য -m দিয়ে চালনা করেন তবে বর্তমান ডিরেক্টরিটি পাইথোনপথে যুক্ত হবে। সুতরাং যদি আপনার প্রোগ্রামের এন্ট্রি পয়েন্টটি import Common.Commonপ্রোজের অভ্যন্তরে থাকে তবে ব্যবহার করে সার্ভার.পি এবং ক্লায়েন্ট.পি উভয়েরই কাজ করা উচিত।

আপেক্ষিক আমদানি করবেন না। আপনি এটি কীভাবে চান তা এটি কাজ করবে না।


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