সিসপথে পাইথন মডিউলটি কীভাবে যুক্ত করবেন?


68

আমার এইরকম একটি ফাইল কাঠামো রয়েছে:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

আমি আমদানি করতে চাই foo2.py এবং foo1.py। আমি চেষ্টা করেছি কিন্তু উবুন্টুতে এটি কাজ করে না:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py

__init__.pyআপনার ফোল্ডারে একটি ফাইল আছে ? এইভাবে পাইথন প্যাকেজ তৈরি করে এবং আপনাকে সেই প্যাকেজ থেকে মডিউল আমদানি করতে দেয়। গাইড.python-distribute.org/creation.html
ব্রায়ান

আমার কাছে কমন এবং টেস্টফোল্ডার
ইউজার 284474

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

এই init .py খালি আছে?
ব্যবহারকারী 284474

1
হ্যাঁ এটা খালি থাকতে পারে। আপনার প্যাকেজটির জন্য যদি আপনার নির্দিষ্ট কনফিগারেশন না
ব্রায়ান

উত্তর:


114

অজগর কীভাবে এর মডিউলগুলি সন্ধান করে

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

ডিফল্টরূপে পাইথন এর মডিউল এবং প্যাকেজগুলিতে সন্ধান করে $PYTHONPATH

Y পাইথনপথে কী অন্তর্ভুক্ত রয়েছে তা জানতে, পাইথনে নিম্নলিখিত কোডটি চালান (3):

import sys
print(sys.path)

ডিরেক্টরি কীভাবে যুক্ত করবেন

কদাচিৎ

পাইথন ফাইলের মধ্যে থেকে, আপনি পাইথন অ্যাপ্লিকেশন বা স্ক্রিপ্টের প্রধান বিভাগে নিম্নলিখিত লাইনগুলি যুক্ত করে মাঝে মাঝে ডিফল্ট পথে পাথ যোগ করতে পারেন:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

উদাহরণ স্বরূপ:

যদি আমার একটি ফোল্ডার থাকে: /home/myname/pythonfilesএবং আমি module_1.pyসেই ডিরেক্টরিতে অবস্থিত ফাইলটি আমদানি করতে চাই , আমি এটি আমার কোডের প্রধান অংশে যুক্ত করব:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

এবং আমি কেবল ফাইলটি আমদানি করতে পারি module_1.py:

import module_1

যখন আমি একটি প্যাকেজ তৈরি করি এবং প্যাকেজটি থেকে মডিউল (গুলি) আমদানি করতে চাই $PYTHONPATH, তখন মডিউলগুলির মধ্যে একটি ফোল্ডার তৈরি করতে হবে, যার সাথে একটি (খালি থাকতে পারে) নামক ফাইল বলা হবে__init__.py

উদাহরণ স্বরূপ:

একটি প্যাকেজ (ফোল্ডারের) নামক থেকে আমদানি করতে my_package/home/myname/pythonfiles, অ্যাড /home/myname/pythonfilesআপনার পাথ $PYTHONPATH, উদাহরণস্বরূপ 1 মত, এবং মডিউল নামক আমদানি module_2.py(প্যাকেজ ফোল্ডারের ভিতরে) কেবল সঙ্গে `

from <packagename> import module_2

$PYTHONPATHস্থায়ীভাবে ডিরেক্টরি যুক্ত করা :

আপনার ~/.profileফাইলে নিম্নলিখিত লাইনটি যুক্ত করুন।

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

সাবডিরেক্টরি

একটি প্যাকেজের মধ্যে থেকে, উপ-ডিরেক্টরিগুলি ঠিক এর মতো অন্তর্ভুক্ত নয়; আপনাকে ডিরেক্টরিগুলি "চেইন" করতে হবে। module_3.pyফোল্ডারের subfolderঅভ্যন্তরে ফোল্ডারের ভিতরে একটি মডিউল আমদানি করতে packagename:

import packagename.subfolder.module_3

এই প্যাকেজের সমস্ত সাব-ফোল্ডারগুলিতে তাদের নিজস্ব __init__.pyফাইল অন্তর্ভুক্ত রয়েছে তা দেওয়া হয়েছিল ।

যখন কোনও মডিউল স্ক্রিপ্ট বা অ্যাপ্লিকেশন হিসাবে একই ডিরেক্টরিতে থাকে

স্ক্রিপ্ট বা অ্যাপ্লিকেশন হিসাবে একই ডিরেক্টরিতে থাকা অবস্থায় কোনও মডিউলটিতে পাথ প্রবেশ করার দরকার নেই, এটি স্বয়ংক্রিয়ভাবে যুক্ত হবে।

উদাহরণ:

আমার যদি একটি ফোল্ডার থাকে script.pyএবং এতে থাকে তবে module.pyআমি কেবল মডিউলটি এগুলি দ্বারা আমদানি করতে পারি:

import module

আমি পাইথন.অর্গ / দেবদেব / পেপস / পেপ-0328 পড়ার পরামর্শও দিতে চাই , বিশেষত যদি আপনি পাইথন 3 (বা ভবিষ্যতে লক্ষ্য করার পরিকল্পনা করছেন) লক্ষ্য করছেন
zaadeh

কিছু printenv PYTHONPATHনেই কেন ?
স্টিভি জি

1
sys.path.append("/path/to/your/package_or_module")এছাড়াও ডিফল্ট একটি পথ যোগ করে এবং এটি কম বিভ্রান্তিকর হয়। sys.path.insert(0,...)যার তুলনায় 0প্রথম যুক্তি হিসাবে রয়েছে ।
পল রৌজিক্স

1
@ পৈলরউজিক্স: পথটিতে সংযোজন করার সমস্যাটি হ'ল আপনার মডিউলটি ইতিমধ্যে পথে অন্য কোথাও উপস্থিত থাকতে পারে (উদাহরণস্বরূপ একটি .egg ফাইলে) এবং আপনি নিজের ফাইলের পরিবর্তে আপনার মডিউলটির সেই সংস্করণটি বেছে নেবেন ।
snark

6

আপেক্ষিক আমদানি ব্যবহারের সঠিক উপায় হ'ল:

from ..Common import foo1

এবং আপনার __init__.pyসমস্ত ফোল্ডারে আপনার একটিও দরকার।


1
ধন্যবাদ. তবে আমার কাছে যদি একটি মডিউল থাকে যা দুটি ফোল্ডার আপ হয় আমি কীভাবে তা আমদানি করব? থেকে .... ফোল্ডারটি কাজ করছে না
ব্যবহারকারী 23444474

এটি কি একক স্তর নিয়ে কাজ করে?
সিলভাইন পাইনাউ

একক স্তরের সাথে এটি কাজ করে।
ব্যবহারকারী 284474

ঠিক আছে, আপনি দয়া করে এই উত্তর গ্রহণ করতে পারেন? মাল্টিলেভেলের জন্য যদিও আপনি আলাদা প্রশ্ন জিজ্ঞাসা করতে পারেন তবে প্রথমে এই প্রশ্নটি দেখুন এবং একটি প্যাকেজের ভিতরে আপনার মডিউলগুলি কল করার ভাল উপায়টির জন্য এই উত্তরটি দেখুন
সিলভাইন পাইনাউ

পাইথন 2 বা পাইথন 3 এর জন্য এটি সত্য? অথবা উভয়?
অ্যালেক্স

2

নোট: এই উত্তরটি পাইথন 3 এর সর্বশেষতম সংস্করণের জন্য পুরানো, তবে এটি পূর্ববর্তী সংস্করণে রয়েছে। আরও তথ্যের জন্য মন্তব্যগুলি পড়ুন এবং https://www.python.org/dev/peps/pep-0420/


মূলত পাইপথন কোড সহ প্রতিটি ফোল্ডারে আপনি সিসপাথে যুক্ত করতে চান একটি __init__.py ফাইল needs এই __init__.py ফাইলগুলি খালি থাকতে পারে।


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

@ অ্যারনহল আকর্ষণীয়, উত্স?
don.joey

1
প্রমাণের জন্য এটি চেষ্টা করুন: python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"এছাড়াও এখানে কিছু প্রাসঙ্গিক ডকুমেন্টেশন রয়েছে, পিইপি 420, যা নেমস্পেস প্যাকেজ শব্দার্থবিজ্ঞানের সংযোজন বর্ণনা করে
অ্যারোন হল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.