একই ডিরেক্টরি বা উপ ডিরেক্টরিতে ক্লাসটি কীভাবে আমদানি করবেন?


675

আমার একটি ডিরেক্টরি রয়েছে যা সমস্ত .py ফাইল সঞ্চয় করে।

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides

আমি মেইন.পি - তে ইউজার.পি এবং ডায়ারপি থেকে ক্লাস ব্যবহার করতে চাই । আমি কীভাবে এই পাইথন ক্লাসগুলি মেইন.পাইতে আমদানি করতে পারি ? তদ্ব্যতীত, User.py একটি উপ ডিরেক্টরিতে থাকলে আমি কীভাবে ক্লাস আমদানি করতে পারি ?

User

bin/
    dir.py
    main.py
    usr/
        user.py


উত্তর:


936

পাইথন 2

কল করা একটি খালি ফাইল করুন __init__.pyফাইলগুলির মতো একই ডিরেক্টরিতে । এটি পাইথনকে বোঝাবে যে এটি "এই ডিরেক্টরি থেকে আমদানি করা ঠিক আছে"।

তাহলে শুধু ...

from user import User
from dir import Dir

ফাইলগুলি একটি উপ-ডিরেক্টরিতে থাকলে একই জিনিসটি সত্য রাখে - উপ-ডিরেক্টরিতেও একটি রাখুন __init__.pyএবং তারপরে বিন্দু চিহ্নিতকরণ সহ নিয়মিত আমদানি বিবরণী ব্যবহার করুন। প্রতিটি স্তরের ডিরেক্টরিতে আপনার আমদানির পথে যুক্ত করতে হবে।

bin/
    main.py
    classes/
        user.py
        dir.py

সুতরাং যদি ডিরেক্টরিটির নাম "ক্লাস" রাখা হয়, তবে আপনি এটি করতেন:

from classes.user import User
from classes.dir import Dir

পাইথন ঘ

পূর্বের মতো একই, তবে মডিউলের নামের সাথে .উপ-ডিরেক্টরি ব্যবহার না করে প্রিফিক্স করুন :

from .user import User
from .dir import Dir

14
যদি __init__.pyহয় না খালি, তারপর যাই হোক না কেন হয় __init__.pyযখন আপনি প্যাকেজ আমদানি (এবং মধ্যে আমদানি করা কিছু কি পাওয়া যাবে __init__.pyএ সব উপলব্ধ হবে না)।
আম্বর

23
কোনও __init__.pyফাইলের আদৌ দরকার কেন ? আমি যদি তিনটি ফাইল একই ডিরেক্টরিতে রেখে চালিত main.pyকরি তবে importএটি অন্য দুটি মডিউল ছাড়াই এটি জরিমানা করতে সক্ষম। আমি কী মিস করছি?
মার্টিনিউ

30
কারণ পাইথন আপনাকে যেভাবে ডিরেক্টরিগুলি আমদানি করার অনুমতি দেয় সেগুলি সনাক্ত করে। আপনি যে স্ক্রিপ্টটি চালাচ্ছেন তার ডিরেক্টরি একটি ব্যতিক্রম - আপনাকে সর্বদা এটি থেকে আমদানি করার অনুমতি দেওয়া হয়।
আম্বার

20
@ এনব্রো এবং অ্যাম্বার: এফডাব্লুআইডাব্লু, আমি মনে করি __init__.pyযে একই ডিরেক্টরিতে অন্য মডিউল আমদানি করতে সক্ষম হওয়ার সাথে সাথে সূক্ষ্ম কিছু পরিবর্তন হয়েছে । বিশেষত importসেই একই ডিরেক্টরিতে থাকা অন্যান্য মডিউলগুলির মধ্যে যে __init__.pyফাইলটি পাইথন ২..8.৮ এ কাজ করেছিল, পাইথন ৩.৪.১ এ ব্যর্থ হয়েছিল। এটির সমাধানের জন্য আমাকে তাদের প্রত্যেককে উপ-ডিরেক্টরির নাম এবং একটি বিন্দুর (যেমন import moduleপরিবর্তন করতে হয়েছিল import subdirectory.module) দিয়ে উপস্থাপন করতে হয়েছিল। ভাগ্যক্রমে এটি এটি করার পরেও পাইথন ২.7.৮ এ কাজ করে।
মার্টিনো 12

4
আমি নিশ্চিত করতে পারি যে এই সমাধানটি আর কার্যকরী নয়। আপনি এটি সংশোধন করতে, সংশোধন করতে বা সরাসরি মুছে ফেলার ইচ্ছা করতে পারেন।
Luís de Sousa

137

আমি কেবল শিখলাম ( মার্টিনোর মন্তব্যের জন্য ধন্যবাদ ) যে একই ডিরেক্টরিতে ফাইল থেকে ক্লাস আমদানি করতে আপনি এখন পাইথন 3 এ লিখবেন:

from .user import User
from .dir import Dir

8
যদি আমি এটি চেষ্টা না করি তবে আমি নিম্নলিখিত ত্রুটিটি পাই ValueError: Attempted relative import in non-packageতবে ভুল হয়ে যায় যখন আমি পরিবর্তন করিfrom user import User
Korpel

আমি ফাইললোডার আমদানি ফাইল লোডার থেকে ব্যবহার করি এবং আমদানি করবো: নাম 'ফাইললোডার' আমদানি করতে পারছি না
ফ্রিকস্টার

3
@Korpel: আলোচনা অনুসরণ stackoverflow.com/questions/11536764/... আমি বুঝতে পারি যে খাসি দেওয়া আমদানি কাজ করে বা না উপরে উপর নির্ভর করে আসা: [1] কিভাবে আপনার স্ক্রিপ্টের (প্যাকেজ হিসাবে বা না হোক) বলা হয় [2] যেখানে আসল কাজের পথ হ'ল আপনি যখন এটি সম্পাদন করেন [3] আপনার রান পরিবেশের পথের পরিবর্তনশীল কীভাবে জনবহুল হয়
ecp

@ করপেল: আমি লক্ষ্য করেছি যে। মডিউলের নামটি কেবল তখনই প্রয়োজন হয় যখন একটি init .py ফাইল উপস্থিত থাকে, যদি না হয়। বাদ দিতে হবে / অবশ্যই করা উচিত।
এমইউজি

39

আপনার main.py:

from user import Class

Classআপনি যে শ্রেণীরটি আমদানি করতে চান তার নাম কোথায় ।

আপনি যদি কোনও পদ্ধতিতে কল করতে চান তবে আপনি Classএটি ব্যবহার করে কল করতে পারেন:

Class.method

মনে রাখবেন যে __init__.pyএকই ডিরেক্টরিতে একটি ফাঁকা ফাইল থাকা উচিত ।


1
আপনি যে মডিউলটি আমদানির চেষ্টা করছেন তার কোনও ক্লাস না থাকলে আপনি কী করবেন? শুধু কাঁচা ফাংশন? অজগর 2 তে আমাকে যা করতে হয়েছিল তা হ'ল 'আমদানি মডিউল'। অজগর 3 এ কাজ করে না, 'আমদানি। মডুল্য' করে না
ফ্রিকস্টার

2
এটিটি মুছে ফেলার পরে পাইথন 3 এ কাজ করে __init__.py
ইঞ্জিনিফোর্স

13

আপনি নিজের সাথে ফাংশন এবং ক্লাসগুলি মিশ্রিত করতে না চাইলে আপনি মডিউলটি আমদানি করতে পারেন এবং এর নামের মাধ্যমে অ্যাক্সেস পেতে পারেন

import util # imports util.py

util.clean()
util.setup(4)

অথবা আপনি আপনার কোডগুলিতে ফাংশন এবং ক্লাসগুলি আমদানি করতে পারেন

from util import clean, setup
clean()
setup(4)

আপনি আপনার কোডটিতে মডিউলটির সমস্ত কিছু আমদানি করতে ওয়াইল্ডচার * ব্যবহার করতে পারেন

from util import *
clean()
setup(4)

10

পাইথন 3 এ আর প্রয়োজন__init__.py হয় না । কনসোলের বর্তমান ডিরেক্টরিটি যদি পাইথন স্ক্রিপ্টটি অবস্থিত ডিরেক্টরি হয় তবে সবকিছু দিয়ে ভাল কাজ করে

import user

তবে, এটি কোনও ভিন্ন ডিরেক্টরি থেকে কল করা থাকলে এটি কাজ করবে না, যা এতে নেই user.py
সেক্ষেত্রে ব্যবহার করুন

from . import user

আপনি সেখান থেকে ক্লাসের পরিবর্তে পুরো ফাইলটি আমদানি করতে চাইলেও এটি কাজ করে।


2
আমি বনাম কোডে পাইলট ব্যবহার করছি, এবং সর্বদা একটি ত্রুটি হিসাবে চিহ্নিত করা হয়েছে এমন একই ডিরেক্টরি আমদানিতে সমস্যা হচ্ছিল ( import userলাল রঙে আন্ডারলাইন করা হয়েছিল); আপেক্ষিক আমদানিতে পরিবর্তিত হয়েছে ( from . import user) এবং লিন্টারটি আর এটি পতাকাঙ্কিত করে না।
আরবি্যাট

9

এটি বুঝতে আরও সহজ করার জন্য:

পদক্ষেপ 1: একটি ডিরেক্টরিতে যেতে দিন, যেখানে সমস্ত অন্তর্ভুক্ত করা হবে

$ cd /var/tmp

পদক্ষেপ 2: এখন একটি Class1.py ফাইল তৈরি করতে দেয় যার কয়েকটি কোড সহ শ্রেণিক নাম Class1 রয়েছে

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF

পদক্ষেপ 3: এখন কিছু কোড সহ শ্রেণি নাম Class2 রয়েছে এমন একটি Class2.py ফাইল তৈরি করতে দিন

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF

পদক্ষেপ 4: এখন একটি মূল.পি তৈরি করতে দেয় যা 2 টি পৃথক ফাইল থেকে Class1 এবং Class2 ব্যবহার করার জন্য একবার কার্যকর করা হবে

$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and  from that file loading Class1"""
from class1 import Class1 
"""this is how we are actually calling class2.py and  from that file loading Class2"""
from class2 import Class2

print Class1.OK
print Class2.OK
EOF

পদক্ষেপ 5: প্রোগ্রামটি চালান

$ python main.py

আউটপুট হবে

[Class1 OK]: 
[Class2 OK]:

4
এবং যদি এটি কাজ না করে এবং মেইন.পি ক্লাস 1 বা ক্লাস 2 পড়তে না পারে তবে কী ঘটবে? ... আমরা কী অনুপস্থিত?
ডার্কগাজে

6

পাইথন ঘ


একই directory

ফাইল আমদানি:log.py

আমদানি শ্রেণী: SampleApp()

import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

অথবা

ডিরেক্টরি হয় basic

ফাইলের মধ্যে আমদানি করুন: log.py

আমদানি শ্রেণী: SampleApp()

from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

5
from user import User 
from dir import Dir 

এটি পাইথন ২.7 এবং পাইথন ৩.6 উভয়ের জন্য init .py ফাইল না নিয়েই আমার পক্ষে কাজ করেছে ।
imsrgadich

1
@ আইমস্রগাদিচ এটি যতক্ষণ কাজ করে আপনি ফাইল ধারণকারী ডিরেক্টরিতে অজগর চালাচ্ছেন। এটি ব্যতিক্রম। এই মন্তব্যটি
সিপরিয়ান টমোয়াগ

5

User.py এবং dir.py যদি ক্লাস সহ না থাকে

from .user import User
from .dir import Dir

কাজ করছে না. তারপরে আপনার এই হিসাবে আমদানি করা উচিত

from . import user
from . import dir

0

আমি নিশ্চিত না কেন এই কাজ কিন্তু পাইচার্ম বিল্ড ব্যবহার করছে from file_in_same_dir import class_name

আইডিই এটি সম্পর্কে অভিযোগ করেছে তবে মনে হয় এটি এখনও কার্যকর হয়েছে। আমি পাইথন ৩.7 ব্যবহার করছি


-2

খুব সংক্ষিপ্ত, একটি ফাইল তৈরি __init__.pyকরা ক্লাস ডিরেক্টরি এবং তারপরে এটি নিম্নলিখিত স্ক্রিপ্টে আমদানি করুন (সমস্ত ক্ষেত্রে আমদানি করুন)

from classes.myscript import *

শুধুমাত্র নির্বাচিত ক্লাস আমদানি করুন

from classes.myscript import User
from classes.myscript import Dir

4
এই উত্তরে দেখা হিসাবে ওয়াইল্ডকার্ড আমদানিগুলি সাধারণত পিইপি 8-তে বর্ণিত খারাপ স্টাইল হিসাবে বিবেচিত হয় ।
V02460

-3

একই ডিরেক্টরি থেকে আমদানি করতে

from . import the_file_you_want_to_import 

সাব ডিরেক্টরি থেকে আমদানি করতে ডিরেক্টরি থাকতে হবে

init .py

আপনি ফাইল ছাড়া অন্য ফাইল

ডিরেক্টরি থেকে আমদানি your_file


3
আমি মনে করি না যে এই উত্তরটি এমন কিছু যুক্ত করেছে যা অন্যান্য উত্তর দেয় নি, এবং এটি অন্যান্য উত্তরগুলির সামগ্রিক সংক্ষিপ্তসার নয়। সুতরাং আমি অবাক হয়েছি কেন আপনি এটি লিখেছিলেন
lucidbrot

-3

Python3

ব্যবহার

from .user import User inside dir.py file

এবং

use from class.dir import Dir inside main.py
or from class.usr import User inside main.py

তাই ভালো


3
এই উত্তরটি ইতিমধ্যে অন্য উত্তরগুলির চেয়ে বেশি কিছু যুক্ত করে না এবং এর কোনও ব্যাখ্যা নেই। আপনার উত্তর যুক্ত করতে বা এটি উন্নত করার কোনও উপায় আছে কি ? কারণ অন্যথায়, এটিকে নিম্নচোট করা হবে যেমন এই উত্তরটি পুরোপুরি মুছে ফেলা হয়েছিল বা সরানো হয়েছিল
দাস_গীক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.