PyDev "Tanımsız değişken içe aktarma" hatalarını nasıl düzeltirim?


138

Eclipse PyDev kullanarak bir Python projesi var ve PyDev kodum için yanlış hatalar üretmeye devam ediyor. settingsBir settingsnesneyi tanımlayan bir modül var . Ben modülde almak bve ile bir öznitelik atar:

from settings import settings
settings.main = object()

Bazı kodlarımda - hepsi değil, ifadeler şöyle:

from settings import settings
print settings.main 

... kod sorunsuz çalışsa bile Eclipse kodu hata bölmesinde "import: main'den tanımlanmamış değişken" mesajları oluştur. Bunları nasıl düzeltebilirim?


Bu cevaplarda pylint ile ilgili hiçbir şey görmedim: \ Bence bu bildirimin kaynağı budur ve pylint'e değişken olmadığını nasıl söyleyeceğini umuyordum, bu bir ithalat.
ThorSummoner

Yanıtlar:


156

Projenizdeki kod için tek yol, muhtemelen if Falseyürütülmemesi için bir korumayla beklediğinizi (statik kod analizi çalışma zamanı bilgilerini değil, yalnızca gördüklerinizi görür) beklediğinizi bildiren bir bildiri eklemektir. bu modülü kendiniz açtığınızda, ana sistemin beklendiğine dair bir işaretiniz olmaz).

Bunun üstesinden gelmek için bazı seçenekler var:

  1. Harici forced builtinsbir modülse , bunu eklemek için PyDev'in çalışma zamanı bilgilerini alması için bir kabuk oluşturması mümkündür ( ayrıntılar için bkz. Http://pydev.org/manual_101_interpreter.html ) - yani: çoğunlukla PyDev bir kabuk içinde modülü almak ve yapmak dir(module)ve dirmevcut tamamlama sayısı ve marka kod analizine modülünde bulunan sınıflar üzerinde.

  2. Hatalı bir satırda Ctrl + 1 (Mac için Cmd + 1) kullanabilirsiniz ve PyDev size bu hatayı yok saymak için bir yorum ekleme seçeneği sunacaktır.

  3. Bir stubmodül oluşturmak ve bunu predefinedtamamlamalara eklemek mümkündür ( http://pydev.org/manual_101_interpreter.html bununla ilgili ayrıntıları da içerir).


1
bazen zorunlu yapılara bir modül eklemek yardımcı olmaz (örneğin bu hataya bakınız, örneğin sourceforge.net/tracker/… )
Boris Gorelik

@Fabio: Önceden tanımlanmış tamamlanmalar burada kullanılabilir mi? Ve eğer böyle bir şey yaparsanız try: import a; except: a=mockModule, yorum yapmadan bunları bastırmanın herhangi bir yolu var mı?
ted

8
Ctrl-1'i denedim, bana bir açıklama ekleyen ve işe yarayan '@UndefinedVariable' veriyor. Teşekkürler.
RichMeister

En son Eclipse ve PyDev ile aynı sorunu yaşıyorum. Tüm modüller arasında gezinebiliyorum, neden kod analizi aynı şeyi yapamaz?
Adam

3
Aşırı uçlara gitmeden önce, dizinin PYTHONPATH içinde olduğundan emin olun, sonra Eclipse'den çıkın / yeniden başlatın, Project> Pydev> Hata işaretleyicilerini kaldır ve numpy artık Zorunlu yerleşiklerde görünmelidir.
smci

49

Ben her diğer satır bu aptal hata var komut dosyaları var böylece ikili vb güveniyor opencv kullanıyorum. Python dinamik bir dildir, bu nedenle bu tür durumlar hata olarak değerlendirilmemelidir.

Bu hataları şu yolla tamamen kaldırdım:

Pencere -> Tercihler -> PyDev -> Editör -> Kod Analizi -> Tanımsız -> İçe Aktarmadan Tanımsız Değişken -> Yoksay

Ve işte bu.

Ayrıca, Pencere -> Tercihler -> PyDev -> Editör -> Kod Analizi -> İthalat -> İçe Aktarım bulunamadı -> Yoksay


8
Bunun için teşekkürler. Basit ve kolaydır. Ancak, "İçe aktarma bulunamadı" ayarını "Yoksay" olarak değiştirmek yerine, "Uyarı" olarak değiştirdim. ŞİMDİ HİÇBİR ŞEY GÖSTERİLMEZ. :) Umarım, GERÇEK bir ithalat sorunum varsa bir Uyarı alacağım.
Sevgi ve barış - Joe Codeswell

1
Değişikliklerin etkili olması için Eclipse'i yeniden başlatmak zorunda kaldım.
spettekaka

21

Yanıt olarak işaretlenen gönderi bir çözüm değil, bir çözüm sağlar.

Bu çözüm benim için çalışıyor:

  • Adresine git Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Forced builtinsSekmeye git
  • Tıklamak New...
  • Modülün adını yazın ( multiprocessingbenim durumumda) ve tıklayınOK

Hata mesajları ortadan kalkmaz, modül üyeleri de tanınır.


1
"Yanıt olarak işaretlenen gönderinin" PyDev geliştiricisi tarafından yazıldığını düşünürsek, belki de ona bir kez daha bakmalısınız. Belirttiğiniz talimatlara bağlantı verdiği için gönderinin kendisinde açık talimatlar vermez.
coredumperror

5
@CoreDumpError Kimin bir yazı yazdığı umurumda değil. Gönderinin tarif ettiklerini denedim ve işe yarıyor, ancak bir çözüm değil, bir çözüm. Açıkladığım şey diğer bilgisayarlar için işe yaramayabilir, ancak benim için işe yarar ve doğru çözümdür. Diğer yazı, tarif etmek yerine çözüme bağlanırsa, yönergeleri izlemezse, başkalarına yardımcı olacağını umarak benim için iyi bir çözümün ne olduğunu açıklayarak yönergeleri izledim.
stenci

2
@Isaac Şimdi öyle, cevabımı düzenlenmeden önce yayınladım.
stenci

Evet, bu çok daha iyi ve temiz bir çözüm! Maskelemek veya gizlemek yerine yasal bir düzeltme sunar. Eklemek zorunda kaldım reama bir kez daha kırmızı mürekkep yapmadımre.M
Bostone

10

Eclipse / PyDev projesinde de benzer bir sorun yaşıyordum. Bu projede, python kodunun kök dizini projenin bir alt diziniydi.

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

Proje hata ayıklandığında veya çalıştırıldığında, çalışma dizini doğru yere ayarlandığından her şey iyiydi. Ancak PyDev kod analizi, modül1 veya modül2'den herhangi bir ithalat bulamadı.

Çözüm, proje özelliklerini -> PyDev - PYTHONPATH bölümünü düzenlemek ve kaynak klasörler sekmesinden / MyProject'i kaldırmak ve bunun yerine / MyProject / src eklemekti.


Sadece bunun mükemmel çalıştığını doğrulamak istedim.
Amndeep7

Evet, basitçe Project / Properties / PyDev - PYTHONPATH ana menüsüne gitti ve sorunu çözen uygulama için gereken tüm yolları ekledi!
Kostyantyn

6

Bu benim için çalıştı:

Adım 1) Yorumlayıcıyı çıkarma, tekrar otomatik yapılandırma

adim 2) Pencere - Tercihler - PyDev - Tercümanlar - Python Tercüman Zorunlu yerleşikler sekmesine gidin Yeni'ye tıklayın ... Modülün adını yazın (benim durumumda lanetler) ve Tamam'a tıklayın

Adım 3) Hangi modülde hata veriyorsa proje kaşifine sağ tıklayın. PyDev-> Kod analizi'ne gidin.


benim için de çalıştı, her adımı şu anda kabul edilen cevaptan daha açık hale getirdiğin için teşekkürler.
sc28

1

Ben de aynı problemi yaşadım. Windows'da Python ve Eclipse kullanıyorum. Kod iyi çalışıyor, ama tutulma her yerde hataları gösteriyor. 'Lib' klasörünün adını 'lib' (C: \ Python27 \ lib) olarak değiştirdikten sonra sorun çözüldü. Harflerin büyük harf kullanımı yapılandırma dosyasındaki harfle eşleşmezse, bu bazen sorunlara neden olur (ancak her zamanki gibi görünmez, çünkü problemler aniden ortaya çıkmadan anlaşılmadan önce hata kontrolü uzun süre iyiydi. sebebi).


4
Eclipse'nin favori eğlencesi bu. Hata bayraklarını bir sebepten dolayı aniden ortaya çıkarmak. Eclipse'nin aniden eğlence ve kâr için rasgele uygulamaya karar verdiği bazı saçma hata bayrağı dışında insanları
DÜNYAYI kırdıklarını düşünerek çılgına çeviriyor

Bunu denedim ve işe yaradığını düşündüm, ama sadece bir ruse oldu , ama 5 dakikadan fazla sürdü, bu yüzden geri alamam. Ancak @ Fabio Zadrozny ctrl-1 @UndefinedVariable mükemmel çalıştı ve 5 dakika sonra bile çalışmaya devam ediyor!
Mark Mikofski

1

Ne yaptığımın bir tahmini:

import module.submodule

class MyClass:
    constant = submodule.constant

Hangi pylint dedi ki: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Bu gibi benim ithalat değiştirerek çözdüm:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Not: Ayrıca, içe aktarılan değişken tarafından, sabit doğasını yansıtacak büyük harfli bir ada sahip olacak şekilde yeniden adlandırıldım.


0

Eclipse içindeki python yolunuzu yeniden yapılandırmanız yeterlidir. Benzer bir soruya cevabımı gör .


0

tercihlerde -> PyDev -> PyLint PyLint geçmek için argümanlar altında bu satırı ekleyin:

--generated-members=objects

bunu oluşturulan her biri için yapmanız gerekir. Bunu googling yaparak buldum, ancak referansı kaybettim.


0

Hangi modülde hata veriyorsa proje kaşifine sağ tıklayın. PyDev-> Hata İşaretlerini Kaldır'a gidin.


0

Cevabım yeni bir şey yapmıyor, sadece karşılaştığım somut bir örnek.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev, "import'den tanımlanmamış değişken: get_default_root_window ()" hata mesajını gösterdi

Python kabuğunda, bunun yukarıdaki bir cevapta belirtildiği gibi bir 'yerleşik' modül olduğunu görebilirsiniz:

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

Şimdi Pencere-> Tercihler-> PyDev-> Tercümanlar-> Python Tercüman altında 'Zorunlu Yapılar' sekmesini seçtim ve listeye 'gtk.gdk' ekledim.

Artık hata mesajı gösterilmedi.


0

Bu 2 adımın benim için her zaman işe yaradığını görüyorum:

  1. Modülün üst klasörünü PYTHONPATH'a doğrulayın (başka bir şekilde ekleyin).
  2. Zorunlu yapılara modülün TAM adını ekleyin.

Burada dikkat edilmesi gerekenler:

  • Bazı popüler modüller, aynı ada sahip bazı üst ve alt çiftlerle birlikte yüklenir. Bu durumlarda, bu üst öğeyi, zaten her şey için onayladığınız / eklediğiniz büyükbaba veya büyük klasörüne ek olarak PYTHONPATH'a eklemeniz gerekir.

  • Zorunlu yapılara eklerken (örneğin) "google.appengine.api.memcache" kullanın, yalnızca "memcache" DEĞİL, bu örnekte "google", PYTHONPATH içinde tanımlanan bir klasörün hemen alt öğesidir.


Zorunlu yapılara nasıl lib.site-Packages._pytest ekleyebilirim ... '-' sembolünü kabul etmiyor ... Yapılandırma modülüyle içe aktarma sorunu yaşıyorum ve çözümünüzü yapmaya çalışıyorum, lütfen yardım edin
gayretli

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.