বিভিন্ন ফোল্ডার থেকে ফাইলগুলি আমদানি করা হচ্ছে


1400

আমি নিম্নলিখিত ফোল্ডার কাঠামো আছে।

application/app/folder/file.py

এবং আমি অন্য পাইথন ফাইলে ফাইল.পি থেকে কিছু ফাংশন আমদানি করতে চাই যা এতে থাকে

application/app2/some_folder/some_file.py

আমি চেষ্টা করেছিলাম

from application.app.folder.file import func_name

এবং আরও কিছু বিভিন্ন প্রচেষ্টা কিন্তু এখন পর্যন্ত আমি সঠিকভাবে আমদানি করতে পারি না। কিভাবে আমি এটি করতে পারব?


2
সম্পর্কিত: stackoverflow.com/q/43476403/674039
উইম

অফিসিয়াল ডকুমেন্টেশন পড়ে আমাকে অনেক সাহায্য করেছে! docs.python.org/3/references/…
রাজু

উত্তর:


1435

ডিফল্টরূপে, আপনি পারবেন না। কোনও ফাইল আমদানি করার সময় পাইথন কেবলমাত্র বর্তমান ডিরেক্টরিটি অনুসন্ধান করে, যে ডিরেক্টরিটি এন্ট্রি-পয়েন্ট স্ক্রিপ্টটি থেকে চালিত হয় এবং sys.pathএতে প্যাকেজ ইনস্টলেশন ডিরেক্টরি হিসাবে অবস্থানগুলি অন্তর্ভুক্ত থাকে (এটি আসলে এর চেয়ে কিছুটা জটিল, তবে এটি বেশিরভাগ ক্ষেত্রে কভার করে) ।

তবে রানটাইমের সময় আপনি পাইথন পথে যুক্ত করতে পারেন:

# some_file.py
import sys
# insert at 1, 0 is the script path (or '' in REPL)
sys.path.insert(1, '/path/to/application/app/folder')

import file

354
sys.path.append('/path/to/application/app/folder')ক্লিনার ইমো
সিউডোসোডো

386
@ সিউডোসোডো: হ্যাঁ, তবে এটি শুরুতে সন্নিবেশ করানোর গ্যারান্টিটি দেওয়ার সুবিধা রয়েছে যে নামকরণ বিরোধের ক্ষেত্রে অন্যদের (এমনকি অন্তর্নির্মিত) আগে পথটি অনুসন্ধান করা হয়েছে।
ক্যামেরন

8
@ ক্রেটিভিটিয়া - sys.pathএকটি listনয়, ফেরত দেয় dequeএবং এটিকে listএকটি dequeএবং পিছনে রূপান্তর করা নির্বোধ হবে।
আর্টঅফ ওয়ারফেয়ার

37
ফোল্ডারে .py ফাইল পরিচালনা করার জন্য এটি অজগর উপায় হিসাবে বিবেচিত হয়? আমি ভাবছি ... এটি ডিফল্টরূপে সমর্থিত নয় কেন? একক ডিরেক্টরিতে সমস্ত .py ফাইল বজায় রাখা কোনও অর্থবোধ করে না ..
Ofir

49
@ ওফির: না, এটি একটি সুন্দর পরিষ্কার পাইথোনিক সমাধান নয়। সাধারণভাবে, আপনার প্যাকেজগুলি ব্যবহার করা উচিত (যা ডিরেক্টরি গাছের উপর ভিত্তি করে)। এই উত্তরটি জিজ্ঞাসিত প্রশ্নের সাথে সুনির্দিষ্ট ছিল এবং কোনও কারণে একটি বিশাল সংখ্যক উপার্জন অব্যাহত রয়েছে।
ক্যামেরন

706

এর সাথে কোনও ভুল নেই:

from application.app.folder.file import func_name

এটি নিশ্চিত করে folderযে এটিতে একটি রয়েছে __init__.py, এটি এটি প্যাকেজ হিসাবে অন্তর্ভুক্ত করতে দেয়। অন্যান্য উত্তর কেন কথা বলছে তা নিশ্চিত নয় PYTHONPATH


47
কারণ এটি এমন ক্ষেত্রে আবদ্ধ PYTHONPATHহয় না যেখানে সংশোধন করা জরুরি। বলুন আপনার একই স্তরে দুটি ফোল্ডার রয়েছে: Aএবং BAএকটি হয়েছে __init.py__। এর Bমধ্যে থেকে কিছু আমদানির চেষ্টা করুন A
এমসভালকন

32
ভিতরে কি init.pyবা __init__.pyফাইল?
Lorem Ipsum ডলর

46
@ Xinyang এটি একটি খালি ফাইল হতে পারে। এর অস্তিত্ব পাইথনকে ডিরেক্টরিটিকে প্যাকেজ হিসাবে বিবেচনা করতে বলে।
জয়

9
অবশ্যই এই উত্তরটি ধরে নিয়েছে applicationএবং appএটি ইতিমধ্যে প্যাকেজগুলি (যেমন আপনার __init__.pyউভয়টিতে ইতিমধ্যে রয়েছে )। যোগ করার ফলে __init__.pyকরার সময় folder, application.app.folderএকটি (সাব) হয়ে প্যাকেজ , যা থেকে আপনি অ্যাক্সেস করতে পারেন মডিউল application.app.folder.file , যার প্রতীক func_nameএখন আমদানি করা যায়
Yibo ইয়াং

29
আমি যাই চেষ্টা করি না কেন, এটি কার্যকর হবে না। আমি একটি "ভাইবোন" ডিরেক্টরি থেকে আমদানি করতে চাই, তাই একে একে নীচে। সকলের পিতামাতাসহ __ init __। পাই রয়েছে। এই অজগর 3-স্পেসিফিক?
ডাসউইজন

109

যখন মডিউলগুলি সমান্তরাল অবস্থানগুলিতে থাকে, যেমন প্রশ্নে:

application/app2/some_folder/some_file.py
application/app2/another_folder/another_file.py

এই শর্টহ্যান্ড একটি মডিউলটিকে অন্যটির কাছে দৃশ্যমান করে তোলে:

import sys
sys.path.append('../')

24
একটি সতর্কতামূলক হিসাবে: আমদানিকৃত স্ক্রিপ্টটি এতে থাকা ডিরেক্টরি থেকে চালিত হওয়া পর্যন্ত এটি কাজ করে। অন্যথায় স্ক্রিপ্টটি যে কোনও ডিরেক্টরি থেকে চালিত হয় তার পিতামহুল ডিরেক্টরি পথটিতে সংযুক্ত হবে এবং আমদানি ব্যর্থ হবে।
কার্ল স্মিথ

14
এটি এড়াতে, আমরা ফাইলের মূল ডিরেক্টরিটি পেতে পারিsys.path.append(os.path.dirname(os.path.abspath(__file__)))
রাহুল

এটি আমার পক্ষে কাজ করে না - পিতামাতার কাছে ফিরে যেতে আমাকে সেখানে একটি অতিরিক্ত নাম যুক্ত করতে হয়েছিল, যাতে cli/foo.pyকমান্ড লাইন থেকে দৌড়ে আসতে সক্ষম হয়েছিলimport cli.bar
আরক্রস

2
@ রাহুল, আপনার সমাধান ইন্টারেক্টিভ শেলগুলির জন্য কাজ করে না
তোয়াই_প্যাটারেলিজম

আপনি যদি এটি আপনার মূল ফোল্ডার (যেমন। অ্যাপ্লিকেশন ফোল্ডার) থেকে চালনা করেন তবে আপনি সম্ভবত sys.path.append('.')মডিউলটি ব্যবহার করে আমদানি করতে ভাল আছেন from app2.some_folder.some_file import your_function। বিকল্পভাবে আমার জন্য যা কাজ করে তা python3 -m app2.another_folder.another_fileরুট ফোল্ডার থেকে চলছে ।
আসক্ত

68

নাম- ফাইল.পি.-এ প্রথমে এসি আমদানি করুন

 import sys

নাম -ফাইল.পি.এ ফোল্ডারে পাথ দ্বিতীয় সংযোজন করুন

sys.path.insert(0, '/the/folder/path/name-package/')

তৃতীয় আপনার উপ-ডিরেক্টরিতে __ init __.py নামে একটি ফাঁকা ফাইল তৈরি করুন (এটি পাইথনকে বলে এটি এটি একটি প্যাকেজ)

  • name-file.py
  • নাম-প্যাকেজ
    • __ দের __.py
    • name-module.py

চতুর্থ নাম ফাইলে.পি ফোল্ডারের ভিতরে মডিউলটি আমদানি করে

from name-package import name-module

5
নেম-ফোল্ডারটি নাম-ফাইল.পি.-এর ঠিক নীচে থাকায় এটি- sys.path.insertকম্যান্ড ছাড়াও কাজ করা উচিত । যেমন, উত্তরটি প্রশ্নটি ছেড়ে দেয়, যদি নাম-ফোল্ডার একটি স্বেচ্ছাসেবী অবস্থানে থাকা অবস্থায়ও এই সমাধানটি কার্যকর হয়।
বাসটিয়ান

55

আমি মনে করি একটি অ্যাড-হক পথ ব্যবহার করতে হবে এনভায়রনমেন্ট ভেরিয়েবলPYTHONPATH ডকুমেন্টেশন বর্ণনা অনুযায়ী: Python2 , Python3

# Linux & OSX
export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH

# Windows
set PYTHONPATH=C:\path\to\dirWithScripts\;%PYTHONPATH%

অপেক্ষা করুন, আমি ফাইলের নাম দিয়ে আমার স্ক্রিপ্টগুলি প্রতিস্থাপন করব?
ভ্লাদিমির পুতিন

4
না, আপনার .py ফাইলে ডিরেক্টরিটির পথ সহ
Ax3l

1
দুর্ভাগ্যক্রমে, আপনি যদি অ্যানাকোন্ডা ব্যবহার করেন তবে এটি কার্যকর হবে না, যেহেতু পাইথনপথ হুডের নিচে সত্যিই অভ্যন্তরীণভাবে ব্যবহৃত হয় না!
information_interchange

অ্যানাকোন্ডায় (সাম্প্রতিক) পরিবর্তনের জন্য, ওয়ার্কফ্লো এবং কাজের চারপাশের মন্তব্যগুলির জন্য এই এসও দেখুন: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১73৩৮68৮৮০/২ সাধারণত আমদানি ডায়ার হ্যাক করার পরিবর্তে ছোট প্যাকেজগুলি তৈরি করুন এবং ইনস্টল করুন।
এক্স

45

এখানে উত্তরগুলির স্বচ্ছতা নেই, এটি পাইথন ৩.6 এ পরীক্ষা করা হয়েছে

এই ফোল্ডার কাঠামো সহ:

main.py
|
---- myfolder/myfile.py

myfile.pyবিষয়বস্তু কোথায় আছে:

def myfunc():
    print('hello')

আমদানির বিবৃতিটি main.pyহ'ল:

from myfolder.myfile import myfunc
myfunc()

এবং এটি হ্যালো প্রিন্ট করবে ।


9
মাইফোল্ডারে একটি init .py (ফাঁকা) কনফিগারেশন ফাইল যুক্ত করে আমার জন্য লিনাক্স (y)
ভিনসেন্ট

7
@ ভিনসেন্ট আপনার মানে __init__.py?
mrgloom

2
@ মিঃগ্রুম সত্যই
ভিনসেন্ট

3
কিছু কারণে যুক্ত করা __init__.pyআমার পক্ষে কাজ করে না। আমি উবুন্টু 18 এ পাই 3.6.5 ব্যবহার করছি It এটি পাইচার্মে কাজ করে তবে টার্মিনাল থেকে নয়
ক্রেয়ারো রোটার

9
এটি বর্তমান প্রশ্নের ডিরেক্টরির চেয়ে ফাইল গাছের ভিন্ন শাখা থেকে ফাইল আমদানি সম্পর্কে জিজ্ঞাসা করা প্রশ্নের সাথে সম্পূর্ণ সম্পর্কিত নয় un
আলেকজান্ডার রোসা

44

আপনার সমস্যাটি হচ্ছে পাইথন এই ফাইলটির জন্য পাইথন ডিরেক্টরিটি অনুসন্ধান করছে এবং এটি খুঁজে পাচ্ছে না। আপনাকে অবশ্যই উল্লেখ করতে হবে যে আপনি যে ডিরেক্টরিটিতে রয়েছেন সেটির কথা বলছেন এবং পাইথনটি নয়।

এটি করতে আপনি এটি পরিবর্তন করুন:

from application.app.folder.file import func_name

এটি:

from .application.app.folder.file import func_name

ডট যুক্ত করে আপনি বলছেন যে পাইথন ডিরেক্টরিটি অনুসন্ধান করার পরিবর্তে অ্যাপ্লিকেশন ফোল্ডারের জন্য এই ফোল্ডারে সন্ধান করুন।


2
এটিই আমাকে স্থির করেছে
পিআই

32

আমি যা জানি, __init__.pyআপনি যে ফাংশনগুলি আমদানি করতে চান তার ফোল্ডারে সরাসরি একটি ফাইল যুক্ত করুন কাজটি করবে।


7
স্ক্রিপ্টটি যে অন্য ডিরেক্টরিটি অন্তর্ভুক্ত করতে চায় তা ইতিমধ্যে sys.path
Ax3l

2
আমি sys.path.append(tools_dir)উইন্ডোতে ব্যবহার করেছি এবং আমার কোনও __init__.py' file in my directory সরঞ্জাম_ডায়ার যুক্ত করার দরকার নেই
herve-guerin

24

পাইথন ৩.৪ এবং তারপরে, আপনি সরাসরি উত্স ফাইল থেকে আমদানি করতে পারেন (ডকুমেন্টেশনের লিঙ্ক) । এটি সহজ সমাধান নয়, তবে আমি এই উত্তরটি সম্পূর্ণতার জন্য অন্তর্ভুক্ত করছি।

এখানে একটি উদাহরণ। প্রথমে ফাইলটি আমদানি করা হবে, নাম foo.py:

def announce():
    print("Imported!")

উপরের ফাইলটি আমদানি করে এমন কোড, ডকুমেন্টেশনের উদাহরণ দ্বারা ভারীভাবে অনুপ্রাণিত হয়েছে:

import importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

foo = module_from_file("foo", "/path/to/foo.py")

if __name__ == "__main__":
    print(foo)
    print(dir(foo))
    foo.announce()

আউটপুট:

<module 'foo' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

নোট করুন যে ভেরিয়েবলের নাম, মডিউলটির নাম এবং ফাইলের নাম মেলে না। এই কোডটি এখনও কাজ করে:

import importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

baz = module_from_file("bar", "/path/to/foo.py")

if __name__ == "__main__":
    print(baz)
    print(dir(baz))
    baz.announce()

আউটপুট:

<module 'bar' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

প্রোগ্রামিয়ালি আমদানি করার মডিউলগুলি পাইথন ৩.১ এ প্রবর্তিত হয়েছিল এবং আপনাকে মডিউলগুলি কীভাবে আমদানি করা হয় তার উপর আরও নিয়ন্ত্রণ দেয়। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন।


11
কেউ এটিকে বোঝার চেষ্টা করেছিল কিনা তা আমি জানি না তবে আমি মনে করি এটি খুব জটিল।
ড্যান

23

আমার জন্য লিনাক্সে পাইথন 3 এ কাজ করেছিলেন

import sys  
sys.path.append(pathToFolderContainingScripts)  
from scriptName import functionName #scriptName without .py extension  

6
sys.path.append("/home/linux/folder/")- শর্টকাট যেমন ব্যবহার করবেন না তা নিশ্চিত করুন"~/folder/"
দাগো

22

পাইথনের আপেক্ষিক আমদানি চেষ্টা করুন:

from ...app.folder.file import func_name

প্রতিটি শীর্ষস্থানীয় বিন্দু বর্তমান ডিরেক্টরি থেকে শুরু করে স্তরক্রমের আরও একটি উচ্চ স্তরের।


সমস্যা? যদি এটি আপনার পক্ষে কাজ করে না তবে আপনি সম্ভবত অনেকগুলি গ্যাচার সাপেক্ষে আমদানি করেছেন। আরও বিশদের জন্য উত্তর এবং মন্তব্য পড়ুন: __init__.py দিয়েও "নন-প্যাকেজে আপেক্ষিক আমদানির চেষ্টা করা" কীভাবে ঠিক করবেন?

ইঙ্গিত: __init__.pyপ্রতিটি ডিরেক্টরি স্তর আছে। python -m application.app2.some_folder.some_fileআপনার শীর্ষ স্তরের ডিরেক্টরি থেকে চালিত হতে পারে বা আপনার পাইথনপথে সেই শীর্ষ স্তরের ডিরেক্টরি থাকতে পারে (পি। পি ছেড়ে দেওয়া) দরকার হতে পারে । রাম রাম!


22

আমি একই চ্যালেঞ্জের মুখোমুখি হয়েছিলাম, বিশেষত একাধিক ফাইল আমদানি করার সময়, আমি এভাবেই কাটিয়ে উঠতে সক্ষম হয়েছি।

import os, sys

from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))

from root_folder import file_name

2
আপনি উত্তরটি আরও সহায়ক হতে পারে যদি আপনি এটি ব্যাখ্যা করতে পারেন যে এটি কোনও সাধারণ আমদানি থেকে আলাদা কী করে?
not2qubit

1
আমার কাছে /path/dir1/__init__.py এবং /path/dir1/mod.py ছিল। Dir1 থেকে /path/some.py এর জন্য। /Path/dir2/some.py এ থাকা অবস্থায় এটি কেবলমাত্র ফাইলের শীর্ষে উপরের উত্তরটি অনুলিপি করে আটকানোর পরে কাজ করে। আমার প্রতিটি পাইথন প্রকল্প / পাথ / এ নেই বলে আমার পথটি সম্পাদনা করতে চাইনি।
জওয়াল

19

বিবেচনা applicationআপনার পাইথন প্রকল্পের জন্য রুট ডিরেক্টরিটি যেমন, একটি খালি তৈরি __init__.pyফাইল application, appএবং folderফোল্ডার নেই। তারপরে some_file.pyফান_নামের সংজ্ঞা পাওয়ার জন্য আপনার পরিবর্তনগুলিতে নিম্নলিখিত পরিবর্তনগুলি করুন:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()

হওয়া উচিত: sys.path.insert (0, r '/ from / root / ডিরেক্টরি')
বলাকা

18

অ্যাপ্লিকেশনটিকে অন্য পরিবেশে স্থানান্তরিত করার সময় একটি পরম পাথ সহ sys.path.append ব্যবহার করা আদর্শ নয়। আপেক্ষিক পাথ ব্যবহার করা সর্বদা কাজ করবে না কারণ বর্তমান কার্যক্ষম ডিরেক্টরিটি স্ক্রিপ্টটি কীভাবে আহ্বান করা হয়েছিল তার উপর নির্ভর করে।

যেহেতু অ্যাপ্লিকেশন ফোল্ডারের কাঠামো স্থির করা হয়েছে, আমরা আমদানি করতে ইচ্ছুক মডিউলটির পুরো পথ পেতে আমরা os.path ব্যবহার করতে পারি। উদাহরণস্বরূপ, যদি এটি কাঠামো হয়:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

এবং যাক যে আপনি "আম" মডিউলটি আমদানি করতে চান। ভ্যানিলা.পিতে আপনি নিম্নলিখিতটি করতে পারেন:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

অবশ্যই, আপনার আমের_ডির ভেরিয়েবলের দরকার নেই।

এটি কীভাবে এই ইন্টারেক্টিভ সেশনের উদাহরণটিকে দেখায় তা বোঝার জন্য:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

এবং os.path ডকুমেন্টেশন চেক করুন ।


13

এটি উইন্ডোতে আমার জন্য কাজ করে

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file

10

আমি বেশ বিশেষ: আমি উইন্ডোজ দিয়ে পাইথন ব্যবহার করি!

আমি কেবলমাত্র তথ্য সম্পূর্ণ করি: উইন্ডোজ এবং লিনাক্স উভয়ের জন্যই আপেক্ষিক এবং পরম পাথ উভয় ক্ষেত্রেই কাজ করে sys.path(আমার আপেক্ষিক পাথ প্রয়োজন কারণ আমি আমার স্ক্রিপ্টগুলি বিভিন্ন পিসিতে এবং বিভিন্ন মূল ডিরেক্টরিতে ব্যবহার করি)।

এবং উইন্ডোজ উভয়ই ব্যবহার করার সময় \এবং /ফাইলের নামের জন্য পৃথক হিসাবে ব্যবহার করা যেতে পারে এবং অবশ্যই আপনাকে \পাইথন স্ট্রিংগুলিতে দ্বিগুণ করতে হবে ,
কিছু কার্যকর উদাহরণ:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(দ্রষ্টব্য: আমি মনে করি যে এটি 'উইন্ডোজ-নেটিভ' কম হলে ইভেন্টের /চেয়ে সুবিধাজনক \কারণ এটি লিনাক্সের সাথে সামঞ্জস্যপূর্ণ এবং উইন্ডোজ এক্সপ্লোরারকে লিখতে এবং অনুলিপি করা সহজ)


4
os.path.join ('সরঞ্জাম', 'mydir')
কোরি গোল্ডবার্গ

7

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

আমি এটি লিনাক্সে পরীক্ষা করেছি তবে এটি কোনও আধুনিক ওএসে কাজ করা উচিত যা প্রতীকী লিঙ্কগুলিকে সমর্থন করে।

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


7

আমার ক্ষেত্রে আমদানি করার জন্য আমার একটি ক্লাস ছিল। আমার ফাইলটি এমন দেখাচ্ছে:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

আমার মূল ফাইলে আমি কোডটি এর মাধ্যমে অন্তর্ভুক্ত করেছি:

import sys
sys.path.append("/opt/path/to/code/")
from log_helper import LogHelper

1
@ not2qubit sys উত্তরে আমদানি করা হয়নি।
ওয়াল্টার

6

আমি একই প্রশ্নে বেশ কয়েকবার ঝাঁপিয়ে পড়েছি, তাই আমি আমার সমাধানটি ভাগ করে নিতে চাই।

পাইথন সংস্করণ: 3.X

নীচের সমাধানটি সেই ব্যক্তির জন্য যারা পাইথন সংস্করণ 3.X এ আপনার অ্যাপ্লিকেশন বিকাশ করেছেন কারণ পাইথন 2 জানুয়ারী / 1/2020 থেকে সমর্থিত নয়

প্রকল্পের কাঠামো

পাইথন 3-তে, ইমপ্লিটিস নেমস্পেস প্যাকেজগুলির__init__.py কারণে আপনার প্রকল্পের উপ-ডিরেক্টরিতে আপনার প্রয়োজন হবে না । দেখুন হল init .py পাইথন প্যাকেজ জন্য প্রয়োজন হয় না 3.3+

Project 
├── main.py
├── .gitignore
|
├── a
|   └── file_a.py
|
└── b
    └── file_b.py

সমস্যা বিবৃতি

ইন file_b.py, আমি ফোল্ডার Aএ এর file_a.pyঅধীনে একটি শ্রেণি আমদানি করতে চাই ।

সলিউশন

# 1 দ্রুত কিন্তু নোংরা উপায়

আপনার মতো প্যাকেজ ইনস্টল না করে বর্তমানে একটি নতুন প্রকল্প বিকাশ করছে

try catchত্রুটিগুলি পরীক্ষা করার জন্য ব্যবহার করে to কোড উদাহরণ:

import sys
try:
    # The insertion index should be 1 because index 0 is this file
    sys.path.insert(1, '/absolute/path/to/folder/a')  # the type of path is string
    # because the system path already have the absolute path to folder a
    # so it can recognize file_a.py while searching 
    from file_a import A
except (ModuleNotFoundError, ImportError) as e:
    print("{} fileure".format(type(e)))
else:
    print("Import succeeded")

# 2 আপনার প্যাকেজ ইনস্টল করুন

একবার আপনি আপনার অ্যাপ্লিকেশন ইনস্টল করে (এই পোস্টে, ইনস্টলেশন টিউটোরিয়াল অন্তর্ভুক্ত করা হয় না)

আপনি সহজভাবে পারেন

try:
    from __future__ import absolute_import
    # now it can reach class A of file_a.py in folder a 
    # by relative import
    from ..a.file_a import A  
except (ModuleNotFoundError, ImportError) as e:
    print("{} fileure".format(type(e)))
else:
    print("Import succeeded")

শুভ কোডিং!



3

আমি এমন প্রকল্পে কাজ করছি aযা আমি ব্যবহারকারীদের pip install aনিম্নলিখিত ফাইল তালিকার মাধ্যমে ইনস্টল করতে চেয়েছিলাম :

.
├── setup.py
├── MANIFEST.in
└── a
    ├── __init__.py
    ├── a.py
    └── b
        ├── __init__.py
        └── b.py

setup.py

from setuptools import setup

setup (
  name='a',
  version='0.0.1',
  packages=['a'],
  package_data={
    'a': ['b/*'],
  },
)

MANIFEST.in

recursive-include b *.*

a / init .py

from __future__ import absolute_import

from a.a import cats
import a.b

A / a.py

cats = 0

a / b / init .py

from __future__ import absolute_import

from a.b.b import dogs

/ বি / b.py

dogs = 1

আমি ডিরেক্টরিটি দিয়ে নিম্নলিখিতটি চালিয়ে মডিউলটি ইনস্টল করেছি MANIFEST.in:

python setup.py install

তারপরে, আমার ফাইল সিস্টেমের সম্পূর্ণ ভিন্ন অবস্থান থেকে আমি /moustache/armwrestleচালাতে সক্ষম হয়েছি:

import a
dir(a)

যা নিশ্চিত করেছে যে a.catsপ্রকৃতপক্ষে 0 এবং a.b.dogsসমান 1 সমান, ইচ্ছাকৃত intended


2

কেবল একটি করার পরিবর্তে এটি করুন import ...:

from <MySubFolder> import <MyFile>

মাইফাইলটি মাইসফোল্ডারের ভিতরে রয়েছে।


1

আপনি এফ 5 টিপে পাইথন শেলটি রিফ্রেশ করতে পারেন, বা রান-> রান মডিউলটিতে যান। এই ফাইলটি থেকে কিছু পড়ার জন্য আপনাকে ডিরেক্টরিটি পরিবর্তন করতে হবে না। পাইথন স্বয়ংক্রিয়ভাবে ডিরেক্টরি পরিবর্তন করবে। তবে আপনি যদি পাইথন শেলের বিভিন্ন ডিরেক্টরি থেকে বিভিন্ন ফাইলের সাথে কাজ করতে চান, তবে আপনি ডিরেক্টরিটি সিস্টেমে পরিবর্তন করতে পারবেন, যেমন ক্যামেরন আগে বলেছিল


1

সুতরাং আমি ঠিক folderতখনই আমার আইডিইতে ক্লিক করেছি এবং একটি নতুন যুক্ত করেছি এবং আমি কেন এটি থেকে আমদানি করতে পারছি না তা ভাবছিলাম। পরে আমি বুঝতে পেরেছিলাম যে আমাকে ডান ক্লিক করতে হবে এবং পাইথন প্যাকেজ তৈরি করতে হবে, না কোনও ক্লাসিক ফাইল সিস্টেম ফোল্ডার। অথবা পোস্ট-মর্টেম পদ্ধতিতে যুক্ত করা হচ্ছে __init__.py(যা পাইথন ফাইল সিস্টেম ফোল্ডারটিকে একটি প্যাকেজ হিসাবে বিবেচনা করে) অন্য উত্তরগুলিতে উল্লিখিত হয়েছে। কেউ যদি এই পথে চলে যায় তবে এই উত্তরটি এখানে যুক্ত করা হচ্ছে।


1

আপনি মডিউলগুলি আমদানি করতে Importlib ব্যবহার করতে পারেন যেখানে আপনি কোনও স্ট্রিং ব্যবহার করে কোনও ফোল্ডার থেকে মডিউল আমদানি করতে চান:

import importlib

scriptName = 'Snake'

script = importlib.import_module('Scripts\\.%s' % scriptName)

এই উদাহরণটিতে একটি মেইন.পি রয়েছে যা উপরের কোড এবং তারপরে স্ক্রিপ্টস নামে একটি ফোল্ডার এবং তারপরে scriptNameভেরিয়েবল পরিবর্তন করে আপনি এই ফোল্ডারটি থেকে যা কিছু প্রয়োজন কল করতে পারবেন । তারপরে scriptআপনি এই মডিউলটি উল্লেখ করতে ব্যবহার করতে পারেন । যেমন Hello()স্নেক মডিউলে আমার যদি একটি ফাংশন বলা হয় আপনি এটি করে এই ফাংশনটি চালাতে পারেন:

script.Hello()

আমি পাইথন 3.6 এ এটি পরীক্ষা করেছি


0

আমি অনেকবার এই সমস্যাগুলি পেয়েছি। আমি এই একই পৃষ্ঠায় অনেক এসেছি। আমার শেষ সমস্যায় আমাকে serverএকটি নির্দিষ্ট ডিরেক্টরি থেকে চালাতে হয়েছিল , তবে যখনই ডিবাগ করতে চাইলে আমি বিভিন্ন সাব-ডিরেক্টরি থেকে চালাতে চাইতাম।

import sys
sys.insert(1, /path) 

হয়নি না আমার জন্য কাজ কারণ বিভিন্ন মডিউল আমি বিভিন্ন পড়তে ছিল * .csv ফাইল যা একই ডিরেক্টরির মধ্যে সব ছিল।

শেষ পর্যন্ত, আমার পক্ষে যা কাজ করেছে তা অজানা নয়, আমার ধারণা, তবে:

আমি if __main__ যে মডিউলটি ডিবাগ করতে চেয়েছিলাম তার উপরে একটি ব্যবহার করেছি , এটি সাধারন পথের চেয়ে আলাদা different

তাই:

# On top of the module, instead of on the bottom
import os
if __name__ == '__main__':
    os.chdir('/path/for/the/regularly/run/directory')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.