PyCharm त्रुटि: 'कोई मॉड्यूल' नहीं जब स्वयं मॉड्यूल आयात करने की कोशिश कर रहा हो (अजगर स्क्रिप्ट)


161

मैंने एक मॉड्यूल ( my_mod.pyफ़ोल्डर में रहने वाली एक फ़ाइल फ़ाइल my_module) लिखा है । वर्तमान में, मैं उस फ़ाइल में काम कर रहा हूं cool_script.pyजो फ़ोल्डर में रहती है cur_proj। मैंने फ़ाइल - ओपन का उपयोग करके PyCharm में फ़ोल्डर खोला है (और मुझे लगता है, इसलिए, यह PyCharm प्रोजेक्ट है)।

ProjectView (CMD-7) में, मैं अपना प्रोजेक्ट cur_proj(लाल रंग में) और "बाहरी पुस्तकालयों" के तहत देख सकता हूँ my_module। Cool_script.py में, मैं लिख सकता हूं

from my_module import my_mod as mm

और PyCharm भी my_mod के लिए सुझाव देता है। अब तक सब ठीक है।

हालाँकि, जब मैं cool_script.py चलाने की कोशिश करता हूं, तो PyCharm मुझे बताता है "my_module नाम का कोई मॉड्यूल नहीं"

यह मुझे अजीब लगता है, क्योंकि

ए) टर्मिनल में (ओएस 10.10.2), अजगर में, मैं मॉड्यूल को कोई समस्या नहीं आयात कर सकता हूं - PbTHONPATH में .bashrc में एक समान प्रविष्टि है।

बी) Pyharm में - सेटिंग्स - प्रोजेक्ट cur_proj - प्रोजेक्ट इंटरप्रेटर - अजगर इंटरप्रेटर के आगे CogWheel - चयनित इंटरप्रिटर आइकन के लिए अधिक पथ दिखाएं - PYTHONPALH से पथ दिखाई देते हैं (जैसा कि मुझे लगता है कि उन्हें चाहिए)

इसलिए, जब मैं cool_script.py चलाने का प्रयास करता हूं तो मुझे त्रुटि क्यों मिलती है? - मुझे क्या याद आ रहा है?

टिप्पणियाँ:

परिशिष्ट 2015-फरवरी -25

जब मैं अपने वर्तमान प्रोजेक्ट के लिए PyCharm में चला जाता हूं - कॉन्फ़िगर संपादन संपादित करता हूं, तो दो विकल्प हैं जो एक चेक मार्क के साथ चुने गए हैं: " PYTHONPATH में सामग्री जड़ें जोड़ें " और " PYTHONPATH के लिए स्रोत जड़ें जोड़ें "। जब मेरे पास दोनों अनियंत्रित हैं, तो मैं अपने मॉड्यूल को लोड कर सकता हूं।

तो यह अब काम करता है - लेकिन क्यों ?

आगे के प्रश्न उभरे:

  • "सामग्री जड़ें" क्या हैं और "स्रोत जड़ें" क्या हैं? और PYTHONPATH में कुछ जोड़ने से यह किसी तरह टूट क्यों जाता है?
  • क्या मुझे उन सभी विकल्पों को हर समय अनचेक करना चाहिए (इसलिए चूक में भी, न केवल परियोजना विशिष्ट कॉन्फ़िगरेशन (रन / डिबग कॉन्फ़िगरेशन डायलॉग के बाएं पैनल)?

2
आप पहले से ही यह कोशिश कर सकते हैं लेकिन जब अन्य पैकेजों से मॉड्यूल आयात करते हैं, तो पैकजेनम शामिल करें from foldername.mymodule import mymethod। एक और बात जो मुझे करनी है वह यह है कि सभी फ़ोल्डरों में खाली _init .py फोल्डर को जोड़ना है, जिसका उपयोग आप अपने मॉड्यूल में करने के लिए करेंगे ताकि यदि from parentfolder.childfolder.mymodule ...आपको दो फ़ोल्डरों में इनट की आवश्यकता होगी। इस बात पर निर्भर करता है कि फ़ोल्डर्स एक दूसरे के सापेक्ष कहाँ स्थित हैं, आपको शीर्ष स्तर के पैकेज की आवश्यकता हो सकती है sys.pathजैसा कि इस उत्तर
ziddarth

4
मुझे आपकी समस्या भी थी। निम्नलिखित पोस्ट ने मेरे मुद्दों को हल किया: stackoverflow.com/questions/21236824/…
user3155053

क्या आपने पहचाना कि उन चेकबॉक्स को अनचेक करना वास्तव में उनकी जाँच के विपरीत क्यों काम करता है?
निशीष इनपुर्जेसी ऑफहैप्पीनेस

मेरे लिए जो काम किया गया वह PyCharm के प्रो संस्करण में Enable Django Supportसेटिंग्स Languages & Frameworks -> Djangoमें अनचेक है । यह एक django कंसोल खोल रहा था जो आयात के मुद्दों का कारण बना।
एरिक ब्लम

जवाबों:


324

यदि आपका अपना मॉड्यूल उसी पथ में है, तो आपको पथ को चिह्नित करना होगा Sources Root। प्रोजेक्ट एक्सप्लोरर में, उस निर्देशिका पर राइट-क्लिक करें जिसे आप आयात करना चाहते हैं। फिर सेलेक्ट Mark Directory Asकरके सेलेक्ट करें Sources Root

आशा है कि ये आपकी मदद करेगा।


9
यह मेरे लिए काम करता है लेकिन मुझे उस रन कॉन्फ़िगरेशन को हटाना और फिर से बनाना था जो मैंने फ़ोल्डर को स्रोत रूट के रूप में चिह्नित करने से पहले बनाया था।
मुस्कराहट

2
और __init__.pyपायथन को पैकेज युक्त निर्देशिकाओं के रूप में व्यवहार करने के लिए जोड़ने की आवश्यकता है: stackoverflow.com/questions/448271/…
बीट्रीज़ फोंसेका

यदि आप pycharm का उपयोग नहीं कर रहे थे तो आप यह कैसे करेंगे? मैं ठीक उसी समस्या में चल रहा हूँ।
बोउदिविज़न आसमन

@BeatrizFonseca हां मैंने किया। मैं इसे उदात्त में काम करने के लिए नहीं मिला, लेकिन मैंने pycharm स्थापित किया और यहां उत्तर देने की कोशिश की और यह पूरी तरह से ठीक काम किया, इसलिए इसे रूट पैकेज के रूप में सही निर्देशिका को निर्दिष्ट करने के साथ कुछ करना होगा।
बोउडविज़न आसमन

@ BoudewijnAasman आप .पैकेज नाम से पहले उपयोग करने की कोशिश कर सकते हैं यह निर्दिष्ट करने के लिए कि यह पैकेज स्थानीय है
बीट्रीज़ फोंसेका

38

इसलिए अगर आप

-> सेटिंग -> परियोजना: My_project -> परियोजना संरचना,

बस निर्देशिका जिसमें स्रोत कोड उपलब्ध है और इसे "स्रोत" के रूप में चिह्नित करें (आप इसे उसी विंडो पर देख सकते हैं)। स्रोत कोड वाली निर्देशिका को नीला होना चाहिए। अब यू एक ही डायरेक्टरी में रहने वाले मॉड्यूल में आयात कर सकते हैं।


3
मुझे लगता है कि यह एक पुरानी पोस्ट है लेकिन इसने मेरे लिए धन्यवाद का काम किया।
माइक - श्रीमती

1
कई बार एक ही जवाब का सामना किया और अनदेखा किया, इस बार कोशिश की और यह काम करता है!
ए .मेटोव

29

PyCharm समुदाय / व्यावसायिक 2018.2.1

मुझे अभी यह समस्या हो रही थी और मैं इसे इसी तरह से हल करने में सक्षम था जैसे @Beatriz Fonseca और @Julie ने बताया।

यदि आप File-> Settings-> Project: YourProjectName-> पर जाते हैं Project Structure, तो आपके पास वर्तमान में जिस प्रोजेक्ट में काम कर रहे हैं, उसकी एक निर्देशिका लेआउट होगी। आपको अपनी निर्देशिकाओं के माध्यम से जाना होगा और उन्हें Sourceअपनी सभी स्रोत फ़ाइलों के लिए निर्देशिका के रूप में लेबल करना होगा। , या Resourceफ़ाइलों के लिए एक फ़ोल्डर के रूप में जो सख्ती से आयात करने के लिए हैं।

आप यह भी सुनिश्चित करना चाहते हैं कि आप __init__.pyअपने संसाधन निर्देशिकाओं के भीतर या वास्तव में कहीं से भी फ़ाइल आयात करें जिसे आप आयात करना चाहते हैं, और यह पूरी तरह से ठीक काम करेगा।

मुझे उम्मीद है कि यह उत्तर किसी को मदद करता है, और उम्मीद है कि JetBrains इस कष्टप्रद बग को ठीक कर देगा।


2
यह PyCharm प्रोफेशनल के लिए विशिष्ट नहीं है , बल्कि यह सुविधा PyCharm सामुदायिक संस्करण में भी उपलब्ध है। प्रोजेक्ट संरचना में, मॉड्यूल युक्त निर्देशिका पर राइट-क्लिक करें और फिर Mark Directory asसंदर्भ मेनू से चयन करें Sources Root
अस्तित्वा श्रीवास्तव

1
क्या आप कृपया सलाह दे सकते हैं कि इस स्रोत का अर्थ क्या है। हालाँकि इससे मेरी समस्या हल हो गई लेकिन मुझे यह समझ में नहीं आया कि मैं ऐसा क्यों कर रहा हूँ।
14:33 पर user3341078

8

मैंने जो कोशिश की है वह उस स्थान का स्रोत है जहां मेरी फाइलें हैं।

जैसे E:\git_projects\My_project\__init__.py is my location.

मैं फ़ाइल -> सेटिंग -> प्रोजेक्ट: My_project -> प्रोजेक्ट स्ट्रक्चर में गया और कंटेंट रूट को उल्लेखित जगह पर जोड़ा E:\git_projects\My_project

यह मेरे लिए काम किया।


2
प्रोजेक्ट संरचना में फ़ोल्डर का स्रोत मेरे लिए काम करता है। धन्यवाद।
माइक्रो

धन्यवाद @ वीरेंद्र पटेल और @ मायक्रोस। मेरा pycharm प्रोजेक्ट है /home/my_user/git_projects/this_git_project/this_pycharm_project/। मैंने /home/my_user/git_projects/this_git_project/सामग्री रूट के /home/my_user/git_projects/this_git_project/this_pycharm_project/रूप में और एकमात्र स्रोत फ़ोल्डर के रूप में जोड़ा और सब कुछ अंत में काम किया।
केलाज़

3

my_moduleएक फ़ोल्डर है जो एक मॉड्यूल नहीं है और आप एक फ़ोल्डर आयात नहीं कर सकते, my_mod.pyउसी फ़ोल्डर में जाने की कोशिश करें cool_script.pyऔर फिर करें import my_mod as mm। इसका कारण यह है कि अजगर केवल वर्तमान निर्देशिका में दिखता है sys.pathऔर my_mod.pyजब तक वह उसी निर्देशिका में नहीं होता है, तब तक नहीं खोजता है

या आप अन्य निर्देशिकाओं से आयात करने का तरीका बता रहे उत्तर के लिए यहां देख सकते हैं ।

आपके अन्य प्रश्नों के रूप में, मुझे नहीं पता है क्योंकि मैं PyCharm का उपयोग नहीं करता हूं।


आप एक फ़ोल्डर में एक init .py बना सकते हैं , अजगर इंटरप्रेटर अजगर पैकेज के रूप में पढ़ेंगे
बीट्रीज़

3

मुझे "PYTHONPATH में स्रोत की जड़ें जोड़ें" के साथ ही त्रुटि हो रही थी। मेरी समस्या यह है कि मैं ही नाम के दो फ़ोल्डरों था, की तरह था project/subproject1/thing/srcऔर project/subproject2/thing/srcऔर मैं उन दोनों के स्रोत जड़ के रूप में चिह्नित किया था। जब मैंने एक "thing"फ़ोल्डर का नाम बदलकर "thing1"(कोई भी अनोखा नाम) रखा, तो यह काम कर गया।

हो सकता है कि अगर PyCharm स्वतः चयनित स्रोत जड़ों को जोड़ता है, तो यह पूर्ण पथ का उपयोग नहीं करता है और इसलिए समान नाम के साथ फ़ोल्डर्स को मिलाता है।


2

यह तब हो सकता है जब पायथन दुभाषिया आपका कोड नहीं खोज सकता। इस स्थान पर अपना कोड खोजने के लिए आपको स्पष्ट रूप से पायथन का उल्लेख करना होगा।

ऐसा करने के लिए:

  • अपने अजगर कंसोल पर जाएं
  • sys.path.extend(['your module location'])पायथन कंसोल में जोड़ें ।

आपके मामले में:

  • अपने अजगर कंसोल पर जाएं,
  • शुरुआत में, निम्नलिखित कोड लिखें:

    import sys
    sys.path.extend([my module URI location])
  • एक बार जब आप इस कथन को लिख लेते हैं, तो आप निम्नलिखित आदेश चला सकते हैं:

    from mymodule import functions

उस तरह से रास्ता जोड़ने के लिए थोड़ा बदसूरत लेकिन यह मेरे लिए काम किया।
फ्लोरियन ब्लूम

यह pycharm द्वारा किया जाना चाहिए, स्वचालित रूप से एक कंसोल खोलते समय उसे निर्देशिकाओं के लिए sys.path.extend आदेशों को निर्भरता (अन्य प्रोजेक्ट्स) और वर्तमान प्रोजेक्ट के स्रोत कोड वाली निर्देशिकाओं को शामिल करना चाहिए। लेकिन यह स्वचालित रूप से नहीं है
10

2

महत्वपूर्ण भ्रामक कदम जो किया जाना चाहिए, उस स्रोत फ़ाइल के लिए रन कॉन्फ़िगरेशन को फिर से बनाना है जिसे आप निष्पादित करने का प्रयास कर रहे हैं, ताकि आईडीई नया पथ चुन ले।

जिस तरह से वास्तव में मेरे लिए काम किया गया था वह रन / एडिट कॉन्फ़िगरेशन को जाने के लिए था ... उस फ़ाइल के लिए कॉन्फ़िगरेशन का चयन करें, जिसे आप बाईं ओर चलाने की कोशिश कर रहे हैं, "PYTHONPATH में स्रोत की जड़ें जोड़ें" बॉक्स को अनचेक करें, सहेजें और फिर वापस जाकर बॉक्स को चेक करें और सेव करें। जब यह काम करेगा।


Invalidate Cache/Restartदो बार करने के बावजूद, आश्चर्यजनक रूप से, मुझे यही चाहिए था !
जोश फ्रीडलैंडर

1

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

अनचेक करने से वे रनटाइम को प्रभावित नहीं करेंगे जब तक कि आप अपने पैकेज में अलग-अलग मॉड्यूल नहीं बना रहे हैं जो मैन्युअल रूप से Django से जुड़े हैं। इसका मतलब है कि अगर आपकी कोई भी फाइल 'django import ...' से नहीं है या किसी भी फंक्शन को django के जरिए नहीं बुलाया गया है, तो इन 2 विकल्पों को अनचेक करने से खराबी आएगी।

अद्यतन - समस्या केवल वर्चुअल Environmanet का उपयोग करते समय उत्पन्न होती है, और केवल जब दिए गए टर्मिनल के माध्यम से परियोजना को नियंत्रित करती है। क्योंकि टर्मिनल अभी भी डिफ़ॉल्ट सिस्टम pyhtonpath के माध्यम से काम करता है न कि वर्चुअल एनवी। जबकि अजगर django नियंत्रण कक्ष ठीक काम करता है।


1

स्रोत रूट के रूप में मार्क डायरेक्टरी के बिना इस समस्या का हल रन कॉन्फ़िगरेशन को संपादित करना है और निष्पादन में "से पुनर्निर्देशित इनपुट" विकल्प चुनें और उस स्क्रिप्ट का चयन करें जिसे आप चलाना चाहते हैं। यह काम करता है क्योंकि यह तब माना जाता है जैसे कि स्क्रिप्ट इस निर्देशिका में अंतःक्रियात्मक रूप से चलाई गई थी। हालाँकि पायथन अभी भी "कोई भी मॉड्यूल जिसका नाम x नहीं है" त्रुटि के साथ मॉड्यूल नाम को चिह्नित करेगा:

से पुनर्निर्देशित इनपुट:

जब दुभाषिया आयात विवरण निष्पादित करता है, तो यह निम्न स्रोतों से इकट्ठे निर्देशिकाओं की सूची में x.py की खोज करता है:

  1. वह निर्देशिका जिसमें से इनपुट स्क्रिप्ट चलाई गई थी या यदि इंटरप्रेटर इंटरेक्टिव रूप से चलाया जा रहा है तो वर्तमान डायरेक्टरी
  2. PYTHONPATH पर्यावरण चर में निहित निर्देशिकाओं की सूची, यदि यह सेट है।
  3. पायथन में स्थापित किए गए समय में कॉन्फ़िगर की गई निर्देशिकाओं की स्थापना-निर्भर सूची, उबंटू में मेरे केस usr / lib / python3.6 में।

0

पाइक्रोम 2017.1.1

  1. View->ToolBar& पर क्लिक करेंView->Tool Buttons
  2. बाएँ फलक पर Projectदिखाई देगा, उस पर राइट क्लिक करें Autoscroll to source और फिर अपना कोड चलाएँ।

इसने मेरे लिए काम किया।


0

ln -s someProject

यदि आपके पास कुछडायरेक्टरी / someProjectDir और दो फाइलें, file1.py और file2.py, और file1.py इस पंक्ति के साथ आयात करने की कोशिश करता है

someProjectDir से file2 आयात करें

यह काम नहीं करेगा, भले ही आपने someProjectDir को एक स्रोत निर्देशिका के रूप में निर्दिष्ट किया हो, और भले ही यह सामग्री रूट के रूप में वरीयताओं, परियोजना, परियोजना संरचना मेनू में प्रदर्शित हो। काम करने का एकमात्र तरीका यह है कि परियोजना को ऊपर दिखाए गए लिंक के रूप में जोड़ा गया है (यूनिक्स कमांड, मैक में काम करता है, विंडोज के लिए उपयोग या वाक्यविन्यास के बारे में सुनिश्चित नहीं है)। ऐसा कुछ तंत्र प्रतीत होता है जहाँ Pycharm स्वचालित रूप से या तो संस्करण नियंत्रण से चेकआउट करता है या संदर्भ रूट के रूप में जोड़ता है, क्योंकि एक आश्रित परियोजना में Pycharm द्वारा नरम लिंक बनाया गया था। इसलिए, केवल उसी की नकल करना, हालांकि निर्देशिका की अजीब प्रतिकृति कष्टप्रद है और आवश्यकता बहुत ही कम है। इसके अलावा निर्भरता में जहां ऑटो बनाया गया था, यह संस्करण नियंत्रण के तहत नई निर्देशिका के रूप में नहीं दिखाता है। शायद .idea फ़ाइलों की तुलना अधिक प्रकट करेगी।


-1

मेरे लिए काम करने वाला जवाब वास्तव में ओपी ने अपने 2015 के अपडेट में क्या उल्लेख किया है: अपने पायथन रन इन दो बॉक्सों को अनचेक करें:

  • "PYTHONPATH में सामग्री जड़ें जोड़ें"
  • "PYTHONPATH में स्रोत की जड़ें जोड़ें"

मेरे पास पहले से ही उचित वेनव का उपयोग करने के लिए रन कॉन्फिग सेट था, इसलिए पाइखार्म चीजों को पथ में जोड़ने के लिए अतिरिक्त काम कर रहा था जो आवश्यक नहीं था। इसके बजाय यह त्रुटियां पैदा कर रहा था।

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