পাইথনে আমার নিজস্ব মডিউলগুলি আমদানি করতে পারে না


141

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

ধরা যাক আমার আছে:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

এখন আমি এই জাতীয় কিছু পাওয়ার চেষ্টা করছি:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

তবে পাইথন myappএটি মডিউল হিসাবে দেখতে পাচ্ছে না বলে আমি অবশ্যই কিছু ভুল করছি :

ImportError: No module named myapp

উত্তর:


96

আপনার বিশেষ ক্ষেত্রে দেখে মনে হচ্ছে আপনি SomeObjectmyapp.py এবং TestCase.py স্ক্রিপ্টগুলি আমদানি করার চেষ্টা করছেন । Myapp.py থেকে, করুন

import SomeObject

যেহেতু এটি একই ফোল্ডারে রয়েছে। টেস্টকেস.পি এর জন্য, করুন

from ..myapp import SomeObject

তবে আপনি যদি প্যাকেজ থেকে টেস্টকেস আমদানি করেন তবে এটি কাজ করবে। আপনি যদি সরাসরি চালাতে চান তবে আপনাকে python TestCase.pyআপনার পথের সাথে ঝামেলা করতে হবে। পাইথনের মধ্যে এটি করা যেতে পারে:

import sys
sys.path.append("..")
from myapp import SomeObject

যদিও এটি সাধারণত সুপারিশ করা হয় না।

সাধারণভাবে, আপনি যদি অন্য লোকেরা আপনার পাইথন প্যাকেজটি ব্যবহার করতে চান তবে সেটআপ স্ক্রিপ্ট তৈরি করতে আপনার ডিস্টুয়েলগুলি ব্যবহার করা উচিত । এইভাবে, যে কেউ আপনার প্যাকেজটি সহজেই এর মতো একটি কমান্ড ব্যবহার করে ইনস্টল করতে পারে python setup.py installএবং এটি তাদের মেশিনে সর্বত্র উপলব্ধ। আপনি যদি প্যাকেজটি সম্পর্কে গুরুতর হন তবে আপনি এটি পাইথন প্যাকেজ সূচক, পাইপিআইতে যুক্ত করতে পারেন


আমি কেবল importআমার মধ্যে ব্যবহার করার চেষ্টা করেছি TestCase.pyকিন্তু এটি এখনও আমাকে একই ত্রুটি দিয়েছে। আমি ধরে নিচ্ছি কারণ এটি এর একটি উপ-ডিরেক্টরিতে আছে __init__.py?
n0pe

ওহ অপেক্ষা কর আমি মনে করি এটি পেয়েছি। যদি আমার পরীক্ষার কেসগুলি প্যাকেজ থেকে কল করে, আমি সঠিকটি ব্যবহার করতে সক্ষম হব from ... import ...?
n0pe

1
আপনি কেবলমাত্র টেস্টকেসটি প্যাকেজের বাইরে থেকে আমদানি করা হচ্ছে যদি উদাহরণস্বরূপ, আমি যদি from myapp.tests import TestCase from a script outside myapp. If you're running পরীক্ষার ফোল্ডারের মধ্যে পাইথন টেস্টকেস.পি` চালাই তবে আপনি আপেক্ষিক আমদানি করতে পারবেন না
ডেভিড রবিনসন

1
আমি মাই্যাপটি ইনস্টল করতে "পাইপ ইনস্টল-ই।" চালিয়েছি, তবে ভিজ্যুয়াল স্টুডিও কোডে টেস্টকেস চালানোর চেষ্টা করার পরেও আমি "আমদানি ত্রুটি: মাইপ নামের কোনও মডিউল" পাই না। তবে যদি আমি "পাইথন" চালাই এবং তারপরে পাইথন রান "মাইয়াপ্স আমদানি সামোবজেক্ট" থেকে এটি কাজ করে। আমি কি ভুল করছি?
ডাগরুন

@DavidRobinson আমি পদ্ধতি আপনি উল্লেখ করেছেন, যে নির্বাহ পরে কোন ত্রুটি দেখিয়েছেন ব্যবহৃত from fodername import file_name_of_my_py_code, কিন্তু যখন আমি বস্তু সংজ্ঞায়িত অ্যাক্সেস করতে গিয়ে file_name_of_my_py_code.pyএটা বলেNameError: name 'ClassName' is not defined
Kavin রাজু এস

44

ফাংশনটি importআপনার পাইথনপথ এনভির মধ্যে ফাইলগুলির সন্ধান করে। পরিবর্তনশীল এবং আপনার স্থানীয় ডিরেক্টরি। সুতরাং আপনি হয় আপনার সমস্ত ফাইল একই ডিরেক্টরিতে রেখে দিতে পারেন, বা পাথ টাইপিং টার্মিনালে রফতানি করতে পারেন ::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

2
তাহলে আমি কীভাবে এটি নিশ্চিত করতে পারি যে এটি ব্যবহার করবে এমন প্রত্যেকের জন্য কাজ করে? আমি তাদের বলার দরকার নেই এটি চালানোর আগে নির্দিষ্ট পরিবেশের ভেরিয়েবল সেট করতে।
n0pe

1
বর্তমান ডিরেক্টরিটি পাইথনপথে রয়েছে, সুতরাং যতক্ষণ স্ক্রিপ্টগুলি একই ফোল্ডার / ডিরেক্টরিতে থাকে ততক্ষণ এটি কাজ করা উচিত। দুর্ভাগ্যক্রমে এই স্ক্রিপ্টগুলির প্রতিটি পৃথক ডিরেক্টরিতে রয়েছে।
জে কেরিচার্টজ

4
উইন্ডোজ ব্যবহারকারীদের পরিবর্তে জন্য exportআমরা "সেট কোনো PYTHONPATH =% কোনো PYTHONPATH%, সি: \ path_to_myapp \ myapp \ myapp \" আছে
loved.by.Jesus

বনাম কোডে আমি আমার লঞ্চে পাইথনপথ এনভ ভেরিয়েবল যুক্ত করে এটি ঠিক করতে সক্ষম হয়েছি: "এনভিভি": P "পাইথনপথ": "{p ওয়ার্কস্পেসফোল্ডার}"}
মাইকেল আর্মিটেজ

11

রফতানির পথটি একটি ভাল উপায়। অন্য উপায়টি হল আপনার সাইট-প্যাকেজগুলির স্থানে একটি .pth যুক্ত করা। আমার ম্যাকটিতে আমার পাইথনটি নীচে দেখানো / লাইব্রেরি / পাইথনে সাইট-প্যাকেজ রাখে

/Library/Python/2.7/site-packages

আমি /Library/Python/2.7/site-packages/awesome.pth এ ভয়ঙ্কর.pth নামে একটি ফাইল তৈরি করেছি এবং ফাইলটিতে আমার দুরন্ত মডিউলগুলি উল্লেখ করে নীচের পথটি রেখেছি

/opt/awesome/custom_python_modules

1
সেক্ষেত্রে আমি উইন্ডোতে কাজ করছি আমি কীভাবে এটি করব
Nwawel A Iroume

আমি নিশ্চিত নই. আপনি উইন্ডো ব্যবহার করছেন যে ক্ষেত্রে। কিছু ভিএম সফ্টওয়্যার সন্ধান করুন এবং লিনাক্স ব্যবহার করুন। অথবা - উইন্ডোতে চলক রফতানি করার ক্ষেত্রে এই উত্তরটি দেখুন। stackoverflow.com/questions/559816/...
jmontross

আমার ঠিক
এটিই

1
@ লি ৮৮ শুনে খুশি হলাম - নিজেকে খুঁজে বের করতে আমাকে কিছুটা সময় নিল :)
jmontross

9

আপনি চেষ্টা করতে পারেন

from myapp.myapp import SomeObject

কারণ আপনার প্রকল্পের নামটি myapp.py এর সমান যা এটি প্রথমে প্রকল্প নথিকে সন্ধান করে


3

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

from setuptools import setup
setup(name='myapp')

কমান্ডলাইনে আপনার প্রথম ম্যাপ অ্যাপের ডিরেক্টরিতে পাইপ ইনস্টল-ই ব্যবহার করুন। প্যাকেজ ইনস্টল করতে


2

pip installউইন্ডোজ 10 এ 'প্রোগ্রাম ফাইল / পাইথোনএক্সএক্স / লিবি / সাইট-প্যাকেজস' ইনস্টল করতে ডিফল্ট যা একটি ডিরেক্টরি যা প্রশাসনিক সুযোগ-সুবিধার প্রয়োজন। সুতরাং আমি প্রশাসক হিসাবে পাইপ ইনস্টল চালিয়ে আমার সমস্যাটি সমাধান করেছি (আপনি প্রশাসক হিসাবে কমান্ড প্রম্পটটি খুলতে হবে এমনকি আপনি প্রশাসক অ্যাকাউন্টে লগ ইন থাকলেও)। এছাড়াও, পাইথন থেকে পাইপ কল করা নিরাপদ।
যেমন
python -m pip install <package-name>
পরিবর্তে
pip install <package-name>


0

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


0

তোমার থাকা দরকার

__init__.py

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

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