সাবফোল্ডার থেকে আমদানি করুন মডিউল


104

আমি মডিউল হিসাবে সাবফোল্ডারগুলি আমদানি করতে চাই। সুতরাং প্রতিটি সাবফোল্ডারে একটি থাকে __init__.py। আমার ফোল্ডার কাঠামোটি এরকম:

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py

আমার মূল স্ক্রিপ্টে আমি আমদানি করি

from dirFoo.foofactory import FooFactory

এই কারখানার ফাইলে আমি সাব মডিউলগুলি অন্তর্ভুক্ত করি:

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

যদি আমি আমার ফুফ্যাক্টরিতে কল করি তবে আমি ত্রুটি পেয়েছি, সেই অজগরটি foo1 এবং foo2 সাব-মডুলগুলি আমদানি করতে পারে না:

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1

উত্তর:


136

আপনার PYTHONPATHবা sys.pathএখানে গণ্ডগোল করার দরকার নেই।

কোনও প্যাকেজে যথাযথ আমদানি সঠিকভাবে ব্যবহার করতে আপনার "রুট" প্যাকেজটির নামও অন্তর্ভুক্ত করা উচিত, যেমন:

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

অথবা আপনি আপেক্ষিক আমদানি ব্যবহার করতে পারেন :

from .dirfoo1.foo1 import Foo1
from .dirfoo2.foo2 import Foo2

47
একটা জিনিস মনে রাখতে হবে! যোগ __init__.pyপ্রত্যেক subfolder আপনি থেকে আমদানি হয়।
আজিজ আল্টো

6
খালি কাজ __init__.pyকরতে পারে।
সেরিব্রু

1
পূর্বে Foo1প্যারেন্ট ডিরেক্টরিতে থাকলে এবং বাক্যটির মতো কিছু কোডড হলে সিনট্যাক্সটি কী হবে from Foo1 import *। সেই একই প্রভাব অর্জনের জন্য কি কোনও উপায় আছে যাতে আপনার সাথে সমস্ত কিছু উপসর্গ করতে না হয় Foo1?
jxramos

1
@ আজিজআল্টো: আপনার মন্তব্য ব্যতীত এই সমাধানটি খুব কার্যকর নয়
অ্যালেক্স

21

শুধু এখানে জানাতে। (একটি নতুন, কেভিভ 22 থেকে)

আপনার নিজের স্বার্থের জন্য এবং কখনও "-" বা "_" এর মতো চিহ্ন সহ ফোল্ডার বা ফাইলগুলির নাম রাখবেন না। আপনি যদি এটি করেন তবে আপনি কয়েকটি সমস্যার মুখোমুখি হতে পারেন। আমার মতো, বলুন, যদিও আমদানির জন্য আপনার আদেশটি সঠিক, আপনি পছন্দসই ফাইলগুলি সফলভাবে আমদানি করতে সক্ষম হবেন না যেমন নামকৃত ফোল্ডারগুলির মধ্যে বিদ্যমান।

নীচে অবৈধ ফোল্ডার নামকরণ:

  • জেনেরিক-ক্লাস-ফোল্ডার
  • Generic_Classes_Folder

উপরের জন্য বৈধ ফোল্ডার নামকরণ:

  • জেনেরিক ক্লাসফোল্ডার বা জেনেরিক ক্লাসফোল্ডার বা জেনেরিক ক্লাসস ফোল্ডার (বা শব্দের মধ্যে কোনও স্পেস বা বিশেষ চিহ্ন ছাড়া এটি পছন্দ করুন)

আমি কি ভুল করেছি:

ফাইল গঠন বিবেচনা করুন।

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py

আমি কি করতে চেয়েছিলাম?

  • testFile.py থেকে, আমি 'টার্গেটক্লাস.পি' ফাইলটিতে "ফাংশনএক্সেকিউট" নামক ফাংশনটি ব্যবহার করতে জেনেরিক-ক্লাস-ফোল্ডার ফাইলের মধ্যে 'টার্গেটক্লাস.পি' ফাইলটি আমদানি করতে চেয়েছিলাম I

আমি কী আদেশ দিলাম?

  • 'testFile.py' থেকে কমান্ড লিখেছেন, from Core.Generic-Class-Folder.targetClass import functionExecute
  • মত ত্রুটি আছে SyntaxError: invalid syntax

অনেকগুলি অনুসন্ধানের চেষ্টা করেছে এবং অনেক স্ট্যাকওভারফ্লো প্রশ্ন দেখেছেন এবং কী ভুল হয়েছে তা সিদ্ধান্ত নিতে অক্ষম। আমি একাধিকবার আমার ফাইলগুলি পরীক্ষা করে দেখেছি, আমি __init__.pyফাইল ব্যবহার করেছি , পরিবেশের পথটি প্রবেশ করিয়েছি এবং কী ভুল হয়েছে তা ভীষণ চিন্তায় ফেলেছি ......

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

(এই উপরের বিশাল পোস্টের জন্য দুঃখিত ... আমার হতাশাগ্রতা কেবল ছেড়ে দেওয়া .... :) ধন্যবাদ!)


22
স্পেস এবং ড্যাশ ("-") এর কারণ হতে পারে তবে আন্ডারস্কোরগুলি ("_") এখনও ঠিক কাজ করা উচিত।
কাপলিনেটর

6

আপনার পাইথনপথ পরিবেশ পরিবর্তনশীল সেট করুন। উদাহরণস্বরূপ এই পাইথনপথ =।: .. (* নিক্স পরিবারের জন্য)।

এছাড়াও আপনি ম্যানুয়ালি পাইথনপথে আপনার বর্তমান ডিরেক্টরি (আপনার ক্ষেত্রে src) যুক্ত করতে পারেন:

import os
import sys
sys.path.insert(0, os.getcwd())

2

আপনার প্রকল্পটি এইভাবে কাঠামোযুক্ত হয়েছে বলুন:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

ভিতরে run.py, আপনি এক এবং দুটি দ্বারা স্ক্রিপ্টগুলি আমদানি করতে পারেন:

from subscripts import script_one as One
from subscripts import script_two as Two

এখন, ভিতরে এখনও run.py, আপনি তাদের পদ্ধতিগুলি সাথে কল করতে সক্ষম হবেন:

One.method_from_one(param)
Two.method_from_two(other_param)

1

কেবল একটি ফাঁকা ___init____.py ফাইল তৈরি করুন এবং এটি মূলের সাথে যুক্ত করুন আপনার পাইথন অ্যাপ্লিকেশনের সমস্ত সাব ডিরেক্টরি / ফোল্ডার যেখানে আপনার অন্যান্য পাইথন মডিউল রয়েছে।


-2

ছিল সমস্যার এমনকি যখন Init subfolder অস্তিত্ব এবং .py যে সব আমদানি করার পরে 'হিসেবে' যোগ করেন অনুপস্থিত ছিল

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