पायथॉन स्क्रिप्ट को चलाने की कोशिश करने पर "ImportError: कोई मॉड्यूल नाम नहीं"


144

मैं एक स्क्रिप्ट चलाने की कोशिश कर रहा हूं, जो अन्य चीजों के साथ लॉन्च होती है, एक अजगर स्क्रिप्ट। मुझे एक ImportError मिलती है: कोई भी मॉड्यूल जिसका नाम नहीं है ..., हालांकि, अगर मैं ipython लॉन्च करता हूं और उसी मॉड्यूल को इंटरप्रेटर के माध्यम से आयात करता हूं, तो मॉड्यूल स्वीकार किया जाता है।

क्या चल रहा है, और मैं इसे कैसे ठीक कर सकता हूं? मैंने समझने की कोशिश की है कि कैसे अजगर PYTHONPATH का उपयोग करता है लेकिन मैं पूरी तरह से भ्रमित हूं। किसी भी मदद की बहुत सराहना की जाएगी।


4
आपको अधिक जानकारी देने की आवश्यकता है। जब आप कहते हैं "एक स्क्रिप्ट चलाएँ", तो क्या आपका मतलब शेल स्क्रिप्ट है? वह कौन सा मॉड्यूल है जिसे आप आयात नहीं कर सकते हैं? वह मॉड्यूल कहाँ स्थित है? आपकी स्क्रिप्ट कहाँ स्थित है?
ब्रेनबर्न

2
यदि आप "क्या चल रहा है" का एक निश्चित उत्तर चाहते हैं, तो -vविकल्प के साथ अजगर को शुरू करें और आप देखेंगे कि आपके द्वारा आयात किए गए मॉड्यूल को खोजने में अजगर कहां है (या नहीं है)।
फाटलएरर

क्या आप आयात करने की कोशिश कर रहे हैं? क्या एक ही निर्देशिका में दो अजगर लिपियाँ हैं?
पाइनोविस

2
कृपया हमें वह कोड दें जो आप चला रहे हैं, स्टैक ट्रेस का पूरा पाठ, और त्रुटि उत्पन्न करने के लिए सटीक कदम। जब हम सटीक समस्या क्या है यह नहीं जानते हैं तो सहायता करना मुश्किल है।
मट्टडामो

5
मुझे लगता है कि यह उपयोगकर्ताओं के अनुभव का एक बहुत समस्या है, यहां तक ​​कि सवाल पूछे जाने के 4 साल बाद भी।
कोडऑलॉट

जवाबों:


183

यह समस्या उन तरीकों के कारण उत्पन्न होती है, जिसमें कमांड लाइन IPython दुभाषिया आपके वर्तमान पथ का उपयोग करता है। जिस तरह से एक अलग प्रक्रिया करता है (यह एक IPython नोटबुक, बाहरी प्रक्रिया, आदि)। IPython इंपोर्ट करने के लिए ऐसे मॉड्यूल की तलाश करेगा जो न केवल आपके sys.path में पाए जाते हैं, बल्कि आपके वर्तमान वर्किंग डायरेक्टरी पर भी होते हैं। कमांड लाइन से एक दुभाषिया शुरू करते समय, आप जिस वर्तमान निर्देशिका में काम कर रहे हैं, वही वही है जिसमें आपने ipython को शुरू किया है - यदि आप चलते हैं।

import os
os.getcwd() 

आप देखेंगे कि यह सच है।

हालाँकि, मान लें कि आप एक ipython नोटबुक का उपयोग कर रहे हैं, चलाएं os.getcwd()और आपकी वर्तमान कार्यशील निर्देशिका उस फ़ोल्डर के बजाय है जिसमें आपने नोटबुक को अपने ipython_notebook_config.py फ़ाइल (आमतौर पर c.NotebookManager.notebook_dirसेटिंग का उपयोग करके) से संचालित करने के लिए कहा था ।

समाधान पथ-से-आपके-मॉड्यूल के साथ अजगर दुभाषिया प्रदान करना है। सबसे सरल उपाय यह है कि उस रास्ते को अपनी sys.path सूची में जोड़ें। अपनी नोटबुक में, पहले प्रयास करें:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

यदि वह काम नहीं करता है, तो आपको अपने हाथों पर एक अलग समस्या आ गई है, जो कि रास्ते से आयात करने के लिए असंबंधित है और आपको अपनी समस्या के बारे में अधिक जानकारी प्रदान करनी चाहिए।

इसे हल करने के लिए बेहतर (और अधिक स्थायी) तरीका अपना PYTHONPATH सेट करना है , जो अजगर पैकेज / मॉड्यूल के लिए अतिरिक्त निर्देशिकाओं के साथ दुभाषिया प्रदान करता है। PYTHONPATH को एक वैश्विक संस्करण के रूप में संपादित करना या स्थापित करना ओएस पर निर्भर है, और यहां यूनिक्स या विंडोज के लिए विस्तार से चर्चा की गई है ।


1
PSA: यदि आप इस SO प्रश्न पर आए हैं क्योंकि आपको यह त्रुटि jupyter-नोटबुक में मिल रही है, तो नीचे देखें, stackoverflow.com/a/27944947/127971 दुर्भाग्य से, यह प्रश्न एक उत्तर के लिए पर्याप्त विशिष्ट नहीं है।
माइकल

@michael कि सामान्य मामले में पायथन मॉड्यूल आयात करने के बारे में है; इंटरप्रिटर को आयात, नोटबुक या नहीं करने के लिए निर्देशिका खोजता है जब dunder init.py फ़ाइल की आवश्यकता होती है। नोटबुक इंटरप्रेटर वर्किंग डायरेक्टरी और PYTHONPATH की सेटिंग के बारे में उपरोक्त उत्तर सही है।
बोल्टजमनब्रेन 19

मैंने कहा था कि प्रश्न के बिगड़ने के कारण कई सही उत्तर होंगे। मैं यह जवाब सही नहीं दे रहा हूँ । लेकिन अगर ज्यूपिटर-नोटबुक का उपयोग कर रहे हैं, तो आप बस फ़ाइल को छूने जा रहे हैं __init_.py, है ना? ... और, न तो संशोधित करना चाहते हैं और PYTHONPATHन ही कॉल करना चाहते हैं sys.path.append, भले ही वे सही (सही?) भी हों। मेरा मतलब है, मेरे पास दर्जनों निर्देशिका w / कोड हैं, और मैं उन सभी को पथ से नहीं जोड़ने जा रहा हूं - या अन्य उपयोगकर्ताओं से उनकी जूपिटर कॉन्फ़िगरेशन फ़ाइल की अपेक्षा करें, भले ही यह एक निर्देशिका हो।
माइकल

16

__init__.pyजब आप पायथन प्रोजेक्ट चला रहे हों, तो फ़ोल्डर के नीचे नाम के साथ एक खाली पाइथन फाइल बनाएं ।


1
' Init.py ' से आपका मतलब '_ init_ .py' है, है ना? मैंने एक खाली फ़ाइल के रूप में _ init_ .py बनाया और यह मेरे लिए काम किया। बहुत बहुत धन्यवाद। लेकिन इसकी आवश्यकता क्यों है? इससे पहले कि मैं अपने ipython नोटबुक के समान निर्देशिका में एक पायथन स्क्रिप्ट और आयात ठीक काम कर रहा था।
एडुआर्डो रीस

3
वास्तव में init .py का उपयोग अजगर को इंगित करने के लिए किया जाता है यह इंगित करने के लिए कि संबंधित स्थान में कुछ पैकेज है। इसके बाद ही इसे उप मॉड्यूल मिलेंगे जो आपने इसके तहत बनाए हैं। अगर आप ' init .py' नहीं बनाते हैं तो इसका मतलब है कि अजगर को नहीं पता कि इसमें कुछ पैकेज है। उदाहरण के लिए: इस उदाहरण के लिए "Myfolder.Mypackage आयात Mymodules" से, आप शुरू करनी चाहिए init बताने के लिए यहाँ कुछ पैकेज है अजगर इंगित करने के लिए .py। और यह पता नहीं है।
मोहिदीन बिन मोहम्मद

1
हां, एकदम सही जवाब। यह अजगर 2.7 में आवश्यक है, लेकिन
अगापे गैलालो

यह मेरे लिए अजगर 3 में समस्या तय की।
रिक

मेरे लिए भी समस्या तय हो गई है - ज्यूपिटर नोटबुक का उपयोग करके, ipynb फ़ाइल के उपनिर्देशिका में अजगर स्रोत के साथ; उदाहरण के लिए, foo.ipynbउपयोग करते हुए bar/baz.py, खाली bar/__init__.pyफ़ाइल जोड़ें ताकि नोटबुक का उपयोग कर सकेंfrom bar.baz import MyClass
माइकल

13

सुनिश्चित करें कि वे दोनों एक ही दुभाषिया का उपयोग कर रहे हैं। यह उबंटू पर मेरे साथ हुआ:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

और sys.pathदोनों दुभाषियों के बीच अलग था। इसे ठीक करने के लिए, मैंने पायथन 3.3 को हटा दिया।


अजगर संबंधित सामान का एक गुच्छा स्थापित करने के लिए मिनीकोन्डा का इस्तेमाल करने से मुझे भी यह समस्या हो गई। बंडल्ड ubuntu python 2.7 मिनिकोंडा पायथन 2.7 से भिन्न है। इस जवाब ने मुझे इस मुद्दे को ठीक करने की अनुमति दी
bf

4
यह मेरी समस्या थी। मैंने अजगर को 2.7.11 में अपग्रेड किया था, लेकिन मेरा iPython इंटरैक्टिव शेल अभी भी 2.7.5 का उपयोग कर रहा था। मुझे केवल pip install --upgrade ipythonनवीनतम संस्करण प्राप्त करने के लिए चलाने की आवश्यकता थी और फिर यह डिफ़ॉल्ट रूप से 2.7.11 का स्वचालित रूप से उपयोग करता था।
अबुंडसेन 10

मेरा IPython 7.4.0 है, जबकि ऐसा कोई पायथन संस्करण नहीं है।
एड्रॉक्स

@aderchox दुभाषिया संस्करण प्राप्त करने के लिए ipython में इसे चलाएं:import sys; sys.version
z0r

7

मुख्य कारण पायथन और आईपीथॉन के sys.paths अलग हैं।

कृपया ल्यूपिपार्क लिंक देखें , समाधान मेरे मामले में काम करता है। यह तब होता है जब द्वारा स्थापित opencv

conda install opencv

और iPython में आयात त्रुटि मिली, इस समस्या को हल करने के लिए तीन चरण हैं:

import cv2
ImportError: ...

1. निम्नलिखित आदेश के साथ अजगर और iPython में पथ की जाँच करें

import sys
sys.path

आप पायथन और जुपिटर से अलग परिणाम पाएंगे। दूसरा कदम, बस sys.path.append कोशिश और त्रुटि से छूटे हुए मार्ग को ठीक करने के लिए उपयोग करें।

2. अस्थायी समाधान

IPython में:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

ImportError:..समस्या हल हो जाती

3. स्थायी समाधान

एक iPython प्रोफ़ाइल बनाएं और प्रारंभिक परिशिष्ट सेट करें:

बैश शेल में:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

Vi में, फ़ाइल में संलग्न करें:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

किया हुआ


'ipython प्रोफाइल बनाएं' .... हाँ! यह एकमात्र (स्थायी) समाधान है जो पर्यावरण की स्थिति PATH और PYTHONPATH से नहीं पढ़ने वाले ज्यूपिटर नोटबुक को संबोधित करता है ... हर फ़ाइल (yuk) की शुरुआत में गंदे sys.path बयानों का सहारा लिए बिना। साभार @jesse
JohnL_10

6

करना sys.path.append('my-path-to-module-folder')काम करेगा, लेकिन हर बार जब आप मॉड्यूल का उपयोग करना चाहते हैं तो आईपीथॉन में ऐसा करने से बचने के लिए, आप export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"अपनी ~/.bash_profileफ़ाइल में जोड़ सकते हैं ।


2

Ipython स्थापित करने से पहले, मैंने easy_install के माध्यम से मॉड्यूल स्थापित किया; कहते हैं sudo easy_install mechanize

Ipython स्थापित करने के बाद, मुझे मॉड्यूल को पहचानने के लिए ipython के लिए easy_install को फिर से चलाना पड़ा।


2

इसी तरह की समस्या थी, python3इसके बजाय फोन करके तय किया python, मेरे मॉड्यूल Python3.5 में थे।


2

यदि आप इसे कमांड लाइन से चला रहे हैं, तो कभी-कभी अजगर दुभाषिया मार्ग के बारे में नहीं जानते हैं जहां मॉड्यूल की तलाश की जाती है।

नीचे मेरी परियोजना की निर्देशिका संरचना है:

/project/apps/..
/project/tests/..

मैं कमांड से नीचे चल रहा था:

>> cd project

>> python tests/my_test.py

कमांड से ऊपर चलने के बाद मुझे नीचे त्रुटि हुई

no module named lib

my_test.py में lib आयात किया गया था

मैंने sys.path मुद्रित किया और मुझे पता चला कि जिस प्रोजेक्ट पर मैं काम कर रहा हूं वह sys.path सूची में उपलब्ध नहीं है

मैंने अपनी स्क्रिप्ट की शुरुआत में कोड नीचे जोड़ा my_test.py

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

मुझे यकीन नहीं है कि यह इसे हल करने का एक अच्छा तरीका है, लेकिन हाँ यह मेरे लिए काम किया।


यदि आप स्क्रिप्ट को हमेशा उसी स्थान से चलाते हैं तो यह काम करेगा। अन्यथा, आप उन समस्याओं में भाग लेंगे, जब os.getcwd()निर्देशिका उस स्क्रिप्ट को चलाती है, जहाँ वह निर्देशिका नहीं है जहाँ स्क्रिप्ट फ़ाइल रहती है।
नाथन आर्थर

1

मैंने इसे कैसे तय किया:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)

1

मैंने पाया है कि इस समस्या का समाधान यहाँ बड़े पैमाने पर प्रलेखित किया गया था:

https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/

मूल रूप से, आपको जुपिटर वातावरण के भीतर संकुल को स्थापित करना होगा, जैसे शेल कमांड जारी करना:

!{sys.executable} -m pip install numpy

कृपया एक आधिकारिक पूर्ण उत्तर के लिए उपरोक्त लिंक की जाँच करें।


0

मुझे इस विसंगति का एक और स्रोत मिला:

मेरे पास ipython स्‍थानीय रूप से और आमतौर पर virtualenvs में स्‍थापित है। मेरी समस्या यह थी कि, ipython के साथ एक नए बने virtualenv के अंदर, सिस्टम ipython को उठाया गया था, जो कि virtualenv में python और ipython (2.7.x बनाम 3.5xx) की तुलना में एक अलग संस्करण था, और प्रफुल्लितता के साथ।

मुझे लगता है कि जब भी कोई ऐसी चीज जो कि बाइनरी में होगी स्थापित करने के लिए स्मार्ट चीज को yourvirtualenv/binतुरंत चलाने के लिए rehashया आप जो भी शेल का उपयोग कर रहे हैं उसके समान है ताकि सही अजगर / आईपिथॉन को उठाया जाए। (उपयुक्त जाँच pipस्थापित हुक हैं ...)


0

स्क्रिप्टिंग के बिना समाधान:

  1. स्पाइडर खोलें -> उपकरण -> PYTHONPATH प्रबंधक
  2. "Add Path" पर क्लिक करके पायथन पथ जोड़ें। जैसे: 'C: \ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ पैकेज'
  3. अन्य प्रोग्राम (जैसे जुपिटर नोटबुक) को चरण 2 में सेट पायथनथ का उपयोग करने की अनुमति देने के लिए "सिंक्रनाइज़ करें ..." पर क्लिक करें।
  4. यदि यह खुला है तो ज्यूपिटर को फिर से शुरू करें

0

यह शायद है अलग अजगर संस्करणों अपने सिस्टम पर स्थापित की वजह से , यानी को Python2 या python3

रन कमांड $ pip --versionऔर $ pip3 --versionयह जांचने के लिए कि पायथन 3x से कौन सा पाइप है । उदाहरण के लिए, आपको नीचे दी गई जानकारी की तरह देखना चाहिए:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

फिर example.pyनीचे कमांड के साथ स्क्रिप्ट चलाएं

$ python3 example.py

0

मुझे निर्देशिका के साथ हुआ utils। मैं इस निर्देशिका को आयात करने की कोशिश कर रहा था:

from utils import somefile

utilsपहले से ही अजगर में एक पैकेज है। बस अपनी निर्देशिका का नाम कुछ अलग करने के लिए बदलें और यह ठीक काम करना चाहिए।


0

पायथन संस्करण के टकराव के कारण इस तरह की त्रुटियां सबसे अधिक होती हैं। उदाहरण के लिए, यदि आपका आवेदन केवल अजगर 3 पर चलता है और आपको अजगर 2 भी मिला है, तो यह निर्दिष्ट करना बेहतर है कि किस संस्करण का उपयोग करना है। उदाहरण के लिए उपयोग करें

python3 .....

के बजाय

python

0

यह उत्तर इस प्रश्न पर लागू होता है यदि

  1. आप अपना कोड नहीं बदलना चाहते हैं
  2. आप PYTHONPATH को स्थायी रूप से बदलना नहीं चाहते हैं

अस्थायी रूप से PYTHONPATH को संशोधित करें

नीचे का मार्ग सापेक्ष हो सकता है

PYTHONPATH=/path/to/dir python script.py


-1

pathlibइसे निकालें और पुनर्स्थापित करें। sitepackagesफ़ोल्डर में पाथलिब हटाएं और पिपल कमांड का उपयोग करके पैथलिब पैकेज को फिर से स्थापित करें:

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