मैं PyDev "आयात से अपरिभाषित चर" त्रुटियों को कैसे ठीक करूं?


138

मुझे ग्रहण में PyDev का उपयोग करके एक Python प्रोजेक्ट मिला है, और PyDev मेरे कोड के लिए गलत त्रुटियां उत्पन्न करता रहता है। मेरे पास एक मॉड्यूल है settingsजो एक settingsवस्तु को परिभाषित करता है । मैं उस मॉड्यूल में आयात करता हूं bऔर इसके साथ एक विशेषता निर्दिष्ट करता हूं :

from settings import settings
settings.main = object()

मेरे कुछ कोड में - लेकिन यह सब नहीं है, जैसे बयान:

from settings import settings
print settings.main 

... ग्रहण कोड त्रुटि में "अपरिभाषित चर: मुख्य" संदेश उत्पन्न करते हैं, भले ही कोड एक समस्या के बिना चलता है। मैं इन्हें कैसे सही कर सकता हूं?


मुझे इन उत्तरों में pylint से संबंधित कुछ भी नहीं दिखाई दिया: \ _ मुझे लगता है कि यह नोटिस कहाँ से उत्पन्न हुआ है और मैं यह जानने की उम्मीद कर रहा था कि कैसे pylint को बताऊं कि यह कोई चर नहीं है, इसका आयात है।
ThorSummoner

जवाबों:


156

अपनी परियोजना में कोड के लिए, एकमात्र तरीका यह कहते हुए एक घोषणा को जोड़ रहा है कि आपने अपेक्षा की है कि - संभवत: एक द्वारा संरक्षित है if Falseताकि यह निष्पादित न हो (स्थैतिक कोड-विश्लेषण केवल वही देखता है जो आप देखते हैं, रनटाइम जानकारी नहीं - यदि आप उस मॉड्यूल को स्वयं खोला, आपके पास कोई संकेत नहीं होगा कि मुख्य की उम्मीद थी)।

इसे दूर करने के लिए कुछ विकल्प हैं:

  1. यदि यह कुछ बाहरी मॉड्यूल है, तो इसे जोड़ना संभव है forced builtinsताकि PyDev रनटाइम जानकारी प्राप्त करने के लिए इसके लिए एक शेल खोले ( विवरण के लिए http://pydev.org/manual_101_interpreter.html देखें) - यानी: अधिकतर, पाइदेव एक खोल में मॉड्यूल आयात और एक कर dir(module)और dirवर्तमान पूर्ण करने और मेकअप कोड विश्लेषण करने के लिए मॉड्यूल में पाया वर्गों पर।

  2. आप एक त्रुटि के साथ Ctrl + 1 (मैक के लिए Cmd + 1) का उपयोग कर सकते हैं और PyDev आपको उस त्रुटि को अनदेखा करने के लिए एक टिप्पणी जोड़ने का विकल्प प्रस्तुत करेगा।

  3. एक stubमॉड्यूल बनाना और इसे predefinedपूर्णता में जोड़ना संभव है ( http://pydev.org/manual_101_interpreter.html उस पर भी विवरण है)।


1
कभी-कभी मजबूर बिल्डिन में एक मॉड्यूल जोड़ने से कोई मदद नहीं होती है (उदाहरण के लिए इस बग को देखें, sourceforge.net/tracker/… )
बोरिस गोरेलिक

@ फैबियो: पूर्वनिर्धारित पूर्णताओं के बारे में क्या वे यहाँ इस्तेमाल किया जा सकता है? और क्या विकल्प हैं यदि आप कुछ ऐसा करते हैं जैसे try: import a; except: a=mockModuleकि टिप्पणियों के बिना इनको दबाने का कोई तरीका है?
टेड

8
मैंने Ctrl-1 की कोशिश की, यह मुझे '@UndefinedVariable' देता है जिसमें एक एनोटेशन और वह काम करता है। धन्यवाद।
रिचमेस्टर

मैं नवीनतम ग्रहण और PyDev के साथ एक ही समस्या का सामना कर रहा हूं। मैं सभी मॉड्यूल के बीच नेविगेट कर सकता हूं, इसलिए कोड-विश्लेषण समान क्यों नहीं कर सकता है?
एडम

3
इससे पहले कि आप चरम सीमा पर जाएं, सुनिश्चित करें कि निर्देशिका PYTHONPATH में है, फिर ग्रहण छोड़ दें / पुनः आरंभ करें, प्रोजेक्ट करें> Pydev> त्रुटि मार्करों को निकालें , और numpy अब फोर्स्ड बिल्डिंग्स में दिखाई देना चाहिए।
16

49

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

मैंने इन त्रुटियों को पूरी तरह से हटा दिया:

विंडो -> वरीयताएँ -> प्यदेव -> संपादक -> कोड विश्लेषण -> अपरिभाषित -> आयात से अपरिभाषित परिवर्तन -> अनदेखा

और वही जो है।

यह भी हो सकता है, विंडो -> प्राथमिकताएं -> PyDev -> संपादक -> कोड विश्लेषण -> आयात -> आयात नहीं मिला -> अनदेखा


8
इसके लिए धन्यवाद। यह सरल और आसान है। हालांकि, "आयात नहीं मिला" सेटिंग को "इग्नोर" करने के लिए बदलने के बजाय, मैंने इसे "चेतावनी" में बदल दिया। अब कुछ भी पता नहीं चल रहा है। :) उम्मीद है, मैं एक चेतावनी मिल जाएगा अगर मैं एक असली आयात समस्या है।
प्यार और शांति - जो कोड्सवेल

1
प्रभावी होने के लिए ग्रहण को फिर से शुरू करना पड़ा।
स्पेटाकाक

21

उत्तर के रूप में चिह्नित पोस्ट समाधान देता है, समाधान नहीं।

यह समाधान मेरे लिए काम करता है:

  • के लिए जाओ Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Forced builtinsटैब पर जाएं
  • पर क्लिक करें New...
  • मॉड्यूल का नाम टाइप करें ( multiprocessingमेरे मामले में) और क्लिक करेंOK

न केवल त्रुटि संदेश गायब हो जाएंगे, मॉड्यूल सदस्यों को भी पहचाना जाएगा।


1
यह मानते हुए कि "पोस्ट को उत्तर के रूप में चिह्नित किया गया है" PyDev के डेवलपर द्वारा लिखा गया था, आपको शायद इस पर एक और नज़र डालनी चाहिए। वह स्वयं पोस्ट में स्पष्ट निर्देश नहीं देता है क्योंकि वह आपके द्वारा निर्दिष्ट निर्देशों से जुड़ता है।
coredumperror

5
@CoreDumpError मुझे ध्यान नहीं है कि किसने पोस्ट लिखी है। मैंने कोशिश की कि पोस्ट क्या बताती है, और यह काम करता है, लेकिन एक समाधान है, समाधान नहीं। मैं जो वर्णन करता हूं वह अन्य कंप्यूटरों के लिए काम नहीं कर सकता है, लेकिन मेरे लिए काम करता है और सही समाधान है। यदि दूसरा पोस्ट वर्णन करने के बजाय समाधान के लिए लिंक करता है, तो यह दिशानिर्देशों का पालन नहीं करता है, मैंने यह वर्णन करके दिशानिर्देशों का पालन किया कि मेरे लिए क्या एक अच्छा समाधान है, उम्मीद है कि दूसरों की मदद करेगा।
स्टेंकी

2
@ इस्साक अब यह करता है, मैंने अपना उत्तर संपादित करने से पहले पोस्ट किया था।
स्टेंकी

हाँ, यह बहुत बेहतर और क्लीनर समाधान है! मास्किंग या छुपाने के बजाय यह कानूनी रूप से तय करता है। मुझे जोड़ना था, reलेकिन एक बार मैंने और अधिक चीजों के लिए लाल स्याही नहीं लगाईre.M
बोसोन

10

मुझे एक एक्लिप्स / प्यदेव प्रोजेक्ट के साथ इसी तरह की समस्या हो रही थी। इस परियोजना में अजगर कोड की मूल निर्देशिका परियोजना की एक उप-निर्देशिका थी।

--> MyProject
 + --> src         Root of python code
   + --> module1     A module 
   + --> module2     Another module
 + --> docs
 + --> test

जब प्रोजेक्ट डीबग किया गया था या सब कुछ ठीक था, क्योंकि वर्किंग डायरेक्टरी सही जगह पर सेट थी। हालांकि PyDev कोड विश्लेषण मॉड्यूल 1 या मॉड्यूल 2 से किसी भी आयात को खोजने में विफल रहा था।

समाधान परियोजना के गुणों को संपादित करने के लिए था -> PyDev - PYTHONPATH अनुभाग और स्रोत फ़ोल्डर टैब से / MyProject को हटा दें और इसके बजाय / MyProject / src जोड़ें।


बस सत्यापन प्रदान करना चाहता था कि यह वास्तव में पूरी तरह से काम करता है।
अमनदीप 7

हां, बस मुख्य मेनू प्रोजेक्ट / प्रॉपर्टीज / PyDev - PYTHONPATH के पास गया और ऐप के लिए आवश्यक सभी रास्तों को जोड़ दिया, जिससे समस्या हल हो गई!
Kostyantyn

6

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

चरण 1) दुभाषिया को हटाना, ऑटो इसे फिर से कॉन्फ़िगर करना

चरण 2) विंडो - प्राथमिकताएं - Pyev - Interpreters - Python Interpreter मजबूर बिल्डिंस टैब पर जाएं नया पर क्लिक करें ... मॉड्यूल का नाम टाइप करें (मेरे मामले में शाप) और क्लिक करें OK

चरण 3) जो भी मॉड्यूल दे रहा है पर प्रोजेक्ट एक्सप्लोरर में राइट क्लिक त्रुटियां दे रहा है। PyDev-> कोड विश्लेषण पर जाएं।


मेरे लिए भी काम किया है, वर्तमान में स्वीकृत उत्तर की तुलना में प्रत्येक चरण को अधिक स्पष्ट करने के लिए धन्यवाद।
sc28

1

मुझे भी यही समस्या थी। मैं विंडोज पर पायथन और एक्लिप्स का उपयोग कर रहा हूं। कोड ठीक चल रहा था, लेकिन हर जगह ग्रहण की त्रुटियां दिखती हैं। जब मैंने फ़ोल्डर 'Lib' का नाम बदलकर 'lib' कर दिया (C: \ Python27 \ lib), समस्या हल हो गई। ऐसा लगता है कि यदि अक्षरों का कैपिटलाइज़ेशन कॉन्फ़िगरेशन फ़ाइल में किसी से मेल नहीं खाता है, तो यह कभी-कभी समस्याओं का कारण होगा (लेकिन ऐसा हमेशा नहीं लगता है, क्योंकि त्रुटि जाँच लंबे समय से पहले ठीक थी क्योंकि समस्याएं अचानक स्पष्ट नहीं हुई थीं कारण)।


4
यह ग्रहण का पसंदीदा शगल है। त्रुटि के झंडे बनाना अचानक बिना किसी कारण के दिखाई देता है। यह लोगों को यह सोचकर पागल कर देता है कि उन्होंने द वर्ल्ड को तोड़ दिया है, सिवाय इसके कि कुछ बकवास त्रुटि ध्वज है जिसे एक्लिप्स ने अचानक मज़े और लाभ (?) के लिए बेतरतीब ढंग से कार्यान्वित करने का फैसला किया है
आर थिएड

मैंने यह कोशिश की, और सोचा कि यह काम कर चुका है, लेकिन यह केवल एक कारण था , लेकिन इसमें 5min लग गए, इसलिए मैं इसे पूर्ववत नहीं कर सकता। हालांकि @ Fabio Zadrozny ctrl-1 @UndefinedVariable ने पूरी तरह से काम किया, और यह 5 मिनट के लिए भी काम करना जारी रखता है!
मार्क मिकोफ़्स्की

1

मैं क्या कर रहा था का एक अनुमान:

import module.submodule

class MyClass:
    constant = submodule.constant

किसके लिए pylint ने कहा: E: 4,15: Undefined variable 'submodule' (undefined-variable)

मैंने अपना आयात बदलकर इसे हल किया:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

नोट: मैं भी आयातित चर का नाम बदलकर उसके निरंतर स्वरूप को प्रतिबिंबित करने के लिए एक अपरकेस नाम रखता हूं।


0

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


0

प्राथमिकताओं में -> PyDev -> PyLint तर्कों के तहत PyLint को पास करने के लिए इस लाइन को जोड़ें:

--generated-members=objects

आपको प्रत्येक उत्पन्न के लिए ऐसा करने की आवश्यकता होगी। मुझे यह googling से मिला, लेकिन मैंने संदर्भ खो दिया।


0

जो भी मॉड्यूल पर परियोजना एक्सप्लोरर में राइट क्लिक त्रुटियों दे रहा है। PyDev-> एरर मार्कर को हटाएं।


0

मेरा जवाब कुछ भी नया योगदान नहीं देता है, बस एक ठोस उदाहरण मुझे मिला है।

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev ने त्रुटि संदेश दिखाया "आयात से अपरिभाषित चर: get_default_root_window ()"

अजगर के खोल में आप देख सकते हैं कि यह एक 'बिल्ट-इन' मॉड्यूल है जैसा कि ऊपर दिए गए उत्तर में दिया गया है:

>>> import gtk.gdk
>>> gtk.gdk
<module 'gtk.gdk' (built-in)>

अब विंडो के तहत-> प्राथमिकताएं-> PyDev-> इंटरप्रिटर्स-> पायथन इंटरप्रेटर, मैंने टैब को 'जबरन निर्मित' चुना और सूची में 'gtk.gdk' जोड़ा।

अब त्रुटि संदेश नहीं दिखा।


0

मुझे लगता है कि ये 2 चरण मेरे लिए हर समय काम करते हैं:

  1. PYTHONPATH मॉड्यूल के मूल फ़ोल्डर की पुष्टि करें (और जोड़ें)।
  2. मॉड्यूल के पूर्ण नाम को मजबूर बिल्डिन में जोड़ें।

यहाँ ध्यान देने योग्य बातें:

  • कुछ लोकप्रिय मॉड्यूल कुछ माता-पिता और बच्चे की जोड़ी के साथ एक ही नाम रखते हैं। इन मामलों में आपको अपने ग्रैंड पैरेंट फ़ोल्डर के अलावा, उस पेरेंट को PYTHONPATH से भी जोड़ना होगा, जिसे आपने पहले से ही सब कुछ के लिए पुष्टि / जोड़ा है।

  • उपयोग किया जाता है (उदाहरण के लिए) "google.appengine.api.memcache" जब मजबूर बिल्डरों में जोड़ा जाता है, तो केवल "मेम्चे" नहीं, जहां इस उदाहरण में "google", PYTHONPADH में परिभाषित फ़ोल्डर का एक तत्काल बच्चा है।


मैं lib.site-package._pytest मजबूर बिल्डरों में कैसे जोड़ सकता हूं ... यह स्वीकार नहीं कर रहा है '-' प्रतीक ... मैं कॉन्फ़िगर मॉड्यूल के साथ आयात समस्या कर रहा हूं और आपके उपाय करने की कोशिश कर रहा हूं, कृपया मदद करें
Zeal

0

यदि आप सुनिश्चित हैं कि आपकी स्क्रिप्ट चलती है और यह एक गलत अलार्म है, तो प्राथमिकताएं> PyDev> संपादक> कोड विश्लेषण पर जाएं। चेतावनियों के लिए त्रुटियों का प्रदर्शन करें।

यहां छवि विवरण दर्ज करें

http://www.pydev.org/manual_adv_code_analysis.html

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