पायथन में अपने खुद के मॉड्यूल आयात नहीं कर सकते


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

चूंकि यह एक ही फ़ोल्डर में है। TestCase.py के लिए, करें

from ..myapp import SomeObject

हालाँकि , यह तभी काम करेगा जब आप पैकेज से TestCase आयात कर रहे हैं। यदि आप सीधे दौड़ना चाहते हैं python TestCase.py, तो आपको अपने रास्ते के साथ खिलवाड़ करना होगा। यह पायथन के भीतर किया जा सकता है:

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

हालांकि यह आमतौर पर अनुशंसित नहीं है।

सामान्य तौर पर, यदि आप चाहते हैं कि अन्य लोग आपके पायथन पैकेज का उपयोग करें, तो आपको सेटअप स्क्रिप्ट बनाने के लिए डिस्टुटिल्स का उपयोग करना चाहिए । इस तरह, कोई भी आपके पैकेज को आसानी से कमांड की तरह उपयोग कर स्थापित कर सकता है python setup.py installऔर यह उनकी मशीन पर हर जगह उपलब्ध होगा। यदि आप पैकेज के बारे में गंभीर हैं, तो आप इसे पायथन पैकेज इंडेक्स, PyPI में भी जोड़ सकते हैं ।


मैंने बस 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
मैंने myapp को स्थापित करने के लिए "pip install -e" चलाया, लेकिन जब विजुअल स्टूडियो कोड में TestCase को चलाने की कोशिश की जा रही थी, तब भी मुझे "ImportError: Myapp नाम का कोई मॉड्यूल नहीं मिला"। लेकिन अगर मैं "पायथन" चलाता हूं और फिर अजगर में "myapp import SomeObject" से काम करता है। मैं क्या गलत कर रहा हूं?
डगरुन

@DavidRobinson मैंने आपके द्वारा बताई गई विधि का उपयोग किया, जिसे निष्पादित करने के बाद कोई त्रुटि नहीं दिखाई दी from fodername import file_name_of_my_py_code, लेकिन जब मैंने इसमें बताई गई वस्तु तक पहुंचने की कोशिश की, file_name_of_my_py_code.pyतो कहा गयाNameError: name 'ClassName' is not defined
काविन राजू एस

44

फ़ंक्शन importआपके PYTHONPATH env में फ़ाइलों की तलाश करता है। चर और अपने स्थानीय निर्देशिका। तो आप या तो अपनी सारी फाइलें एक ही डायरेक्टरी में रख सकते हैं, या एक टर्मिनल में टाइपिंग का निर्यात कर सकते हैं ::

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

2
फिर मैं यह कैसे सुनिश्चित कर सकता हूं कि यह हर किसी के लिए काम करेगा जो इसका उपयोग करेगा? मैं इसे चलाने से पहले कुछ निश्चित वातावरण चर निर्धारित करने के लिए नहीं कहना चाहता।
n0pe

1
वर्तमान निर्देशिका pythonpath में है, इसलिए जब तक स्क्रिप्ट एक ही फ़ोल्डर / निर्देशिका में हैं तब तक इसे काम करना चाहिए। दुर्भाग्य से इनमें से प्रत्येक स्क्रिप्ट अलग-अलग निर्देशिकाओं में है।
JKirchartz

4
विंडोज उपयोगकर्ताओं के लिए, हमारे बजाय export"सेट PYTHONPATH =% PYTHONPATH पैकेज है; C: \ path_to_myapp \ myapp \ myapp \"
love.by.Jesus

बनाम कोड में मैं अपने लॉन्च में PYTHONPATH Env वैरिएबल को जोड़कर इसे ठीक करने में सक्षम था। json: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
माइकल प्रशंसा

11

निर्यात पथ एक अच्छा तरीका है। दूसरा तरीका यह है कि अपने साइट-संकुल स्थान में .pth जोड़ें। मेरे मैक पर मेरा अजगर साइट-पैकेज / लाइब्रेरी / पायथन नीचे रखता है

/Library/Python/2.7/site-packages

मैंने एक फ़ाइल बनाई है जिसका नाम है भयानक ।pth /Library/Python/2.7/site-packages/awesome.pth पर और फ़ाइल में निम्न पथ है जो मेरे भयानक मॉड्यूल का संदर्भ देता है

/opt/awesome/custom_python_modules

1
मामले में मैं खिड़कियों में काम कर रहा हूँ कि मैं कैसे करते हैं
16:25

मुझे यकीन नहीं है। उस स्थिति में जब आप विंडोज़ का उपयोग कर रहे हैं। कुछ वीएम सॉफ्टवेयर खोजें और लिनक्स का उपयोग करें। या - खिड़कियों में चर निर्यात करने पर यह उत्तर देखें। stackoverflow.com/questions/559816/…
jmontross

यह ठीक वही है
जिसकी

1
यह सुनकर प्रसन्नता हुई कि @ ली88 - ने मुझे स्वयं पता लगाने के लिए कुछ समय लिया :)
जॉम्प्रॉस

9

तुम कोशिश कर सकते हो

from myapp.myapp import SomeObject

क्योंकि आपके प्रोजेक्ट का नाम myapp.py जैसा ही है, जो पहले प्रोजेक्ट दस्तावेज़ को खोजता है


3

आपकी पहली myapp डायरेक्टरी में, u एक setup.py फ़ाइल जोड़ सकते हैं और setup.py में दो python कोड जोड़ सकते हैं

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

कमांडलाइन में आपकी पहली myapp डायरेक्टरी में, पाइप इंस्टाल -e का उपयोग करें। पैकेज स्थापित करने के लिए


2

pip installविंडोज 10 पर 'प्रोग्राम फाइल्स / पायथनएक्सएक्सएक्स / लिब / साइट-पैकेज' में स्थापित करने के लिए चूक जो एक निर्देशिका है जिसे प्रशासनिक विशेषाधिकारों की आवश्यकता होती है। इसलिए मैंने प्रशासक के रूप में पाइप इंस्टॉल को चलाकर अपना मुद्दा ठीक किया (आपको व्यवस्थापक खाते के साथ लॉग इन होने पर भी प्रशासक के रूप में कमांड प्रॉम्प्ट खोलना होगा)। इसके अलावा, अजगर से पाइप को कॉल करना अधिक सुरक्षित है।
के
python -m pip install <package-name>
बजाय उदाहरण के लिए
pip install <package-name>


0

मेरे मामले में यह विंडोज बनाम पायथन आश्चर्य था, विंडोज फाइलनाम के मामले संवेदनशील नहीं होने के बावजूद, पायथन आयात है। इसलिए यदि आपके पास Stuff.pyफ़ाइल है तो आपको इस नाम को आयात करना होगा।


0

आपके पास होना चाहिए

__init__.py

उन सभी फ़ोल्डरों में जिनके पास कोड है जिनसे आपको इंटरैक्ट करना होगा। आपको अपनी परियोजना के शीर्ष फ़ोल्डर का नाम भी हर आयात में निर्दिष्ट करना होगा, भले ही आपने जिस फ़ाइल को आयात करने का प्रयास किया हो वह उसी स्तर पर हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.