Bagaimana cara memperbaiki kesalahan "Undefined variable from import" PyDev?

138

Saya punya proyek Python menggunakan PyDev di Eclipse, dan PyDev terus menghasilkan kesalahan palsu untuk kode saya. Saya memiliki modul settingsyang mendefinisikan settingsobjek. Saya mengimpornya dalam modul bdan menetapkan atribut dengan:

from settings import settings
settings.main = object()

Dalam beberapa kode saya - tetapi tidak semuanya, pernyataan seperti:

from settings import settings
print settings.main 

... menghasilkan pesan "Variabel tidak terdefinisi dari impor: utama" di panel kesalahan kode Eclipse, meskipun kode berjalan tanpa masalah. Bagaimana saya bisa memperbaikinya?

Chris B.
sumber
Saya tidak melihat apa pun yang terkait dengan pylint dalam jawaban ini: \ Saya pikir dari sanalah pemberitahuan ini berasal dan saya berharap menemukan cara memberi tahu pylint bahwa itu bukan variabel, ini impor.
ThorSummoner

Jawaban:

156

Untuk kode dalam proyek Anda, satu-satunya cara adalah menambahkan deklarasi yang mengatakan bahwa Anda mengharapkannya - mungkin dilindungi oleh perintah if Falseagar tidak dieksekusi (analisis kode statis hanya melihat apa yang Anda lihat, bukan info runtime - jika Anda buka modul itu sendiri, Anda tidak akan memiliki indikasi bahwa main diharapkan).

Untuk mengatasinya ada beberapa pilihan:

  1. Jika itu adalah beberapa modul eksternal, dimungkinkan untuk menambahkannya ke forced builtinssehingga PyDev memunculkan shell untuk mendapatkan informasi runtime (lihat http://pydev.org/manual_101_interpreter.html untuk rinciannya) - yaitu: kebanyakan, PyDev akan impor modul dalam shell dan lakukan a dir(module)dan dirpada kelas yang ditemukan dalam modul untuk menyajikan penyelesaian dan membuat analisis kode.

  2. Anda dapat menggunakan Ctrl + 1 (Cmd + 1 untuk Mac) sejalan dengan kesalahan dan PyDev akan memberi Anda opsi untuk menambahkan komentar untuk mengabaikan kesalahan itu.

  3. Dimungkinkan untuk membuat stubmodul dan menambahkannya ke predefinedkelengkapan ( http://pydev.org/manual_101_interpreter.html juga memiliki perincian tentang itu).

Fabio Zadrozny
sumber
1
kadang-kadang menambahkan modul ke builtin paksa tidak membantu (lihat bug ini, misalnya sourceforge.net/tracker/... )
Boris Gorelik
@Fabio: Bagaimana dengan pelengkapan standar yang bisa digunakan di sini? Dan opsi apa yang ada jika Anda melakukan sesuatu seperti try: import a; except: a=mockModuleapakah ada cara untuk menekan ini tanpa komentar?
ted
8
Saya mencoba Ctrl-1 itu memberi saya '@UndefinedVariable' yang menambahkan anotasi dan berfungsi. Terima kasih.
RichMeister
Saya mengalami masalah yang sama dengan Eclipse dan PyDev terbaru. Saya dapat menavigasi antara semua modul, jadi mengapa analisis kode tidak dapat melakukan hal yang sama?
Adam
3
Sebelum Anda pergi ke ekstrem, pastikan direktori berada di PYTHONPATH, lalu keluar / mulai ulang Eclipse, lakukan Project> Pydev> Hapus penanda kesalahan , dan numpy sekarang akan muncul di Forins builtins.
smci
49

Saya menggunakan OpenCV yang bergantung pada binari dll jadi saya punya skrip di mana setiap baris memiliki kesalahan konyol ini. Python adalah bahasa yang dinamis sehingga kesempatan seperti itu tidak dianggap kesalahan.

Saya menghapus semua kesalahan ini dengan membuka:

Window -> Preferences -> PyDev -> Editor -> Analisis Kode -> Undefined -> Undefined Variable From Import -> Ignore

Dan itu saja.

Mungkin juga, Window -> Preferences -> PyDev -> Editor -> Analisis Kode -> Impor -> Impor tidak ditemukan -> Abaikan

ubershmekel
sumber
8
Terima kasih untuk ini. Sederhana dan mudah. Namun, alih-alih mengubah pengaturan "Impor tidak ditemukan" menjadi "Abaikan", saya mengubahnya menjadi "Peringatan". SEKARANG TIDAK ADA YANG MENUNJUKKAN. :) Semoga, saya akan mendapatkan Peringatan jika saya memiliki masalah impor NYATA.
Cinta dan kedamaian - Joe Codeswell
1
Harus memulai ulang Eclipse agar perubahan diterapkan.
spettekaka
21

Posting yang ditandai sebagai jawaban memberikan solusi, bukan solusi.

Solusi ini bekerja untuk saya:

  • Pergi ke Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Buka Forced builtinstab
  • Klik New...
  • Ketikkan nama modul ( multiprocessingdalam kasus saya) dan klikOK

Tidak hanya pesan kesalahan akan hilang, anggota modul juga akan dikenali.

stenci
sumber
1
Mempertimbangkan bahwa "posting yang ditandai sebagai jawaban" ditulis oleh pengembang PyDev, Anda mungkin harus melihatnya lagi. Dia tidak memberikan instruksi eksplisit dalam posting itu sendiri karena dia menautkan ke instruksi yang Anda tentukan.
coredumperror
5
@CoreDumpError Saya tidak peduli siapa yang menulis posting. Saya mencoba apa yang dijelaskan oleh pos, dan berhasil, tetapi merupakan solusi, bukan solusi. Apa yang saya jelaskan mungkin tidak berfungsi untuk komputer lain, tetapi bekerja untuk saya dan merupakan solusi yang tepat. Jika posting yang lain menghubungkan ke solusi alih-alih menggambarkannya, maka itu tidak mengikuti pedoman, saya mengikuti pedoman dengan menjelaskan apa solusi yang baik untuk saya, berharap itu akan membantu orang lain.
stenci
2
@Isaac Sekarang ya, saya memposting jawaban saya sebelum diedit.
stenci
Ya, ini adalah solusi yang jauh lebih baik dan lebih bersih! Alih-alih menutupi atau menyembunyikannya menawarkan perbaikan yang sah. Saya harus menambahkan retetapi sekali saya tidak lagi menggunakan tinta merah untuk hal-hal sepertire.M
Bostone
10

Saya mengalami masalah serupa dengan proyek Eclipse / PyDev. Dalam proyek ini direktori root dari kode python adalah sub-direktori dari proyek.

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

Ketika proyek itu di-debug atau menjalankan semuanya baik-baik saja karena direktori kerja ditetapkan ke tempat yang benar. Namun analisis kode PyDev gagal menemukan impor dari module1 atau module2.

Solusi adalah mengedit properti proyek -> PyDev - bagian PYTHONPATH dan menghapus / MyProject dari tab folder sumber dan tambahkan / MyProject / src sebagai gantinya.

Jules
sumber
Hanya ingin memberikan verifikasi bahwa ini sebenarnya berfungsi dengan baik.
Amndeep7
Yap, cukup buka menu utama Project / Properties / PyDev - PYTHONPATH dan menambahkan semua jalur yang diperlukan untuk aplikasi, yang menyelesaikan masalah!
Kostyantyn
6

Ini bekerja untuk saya:

langkah 1) Menghapus penerjemah, mengonfigurasikannya kembali secara otomatis

langkah 2) Jendela - Preferensi - PyDev - Juru Bahasa - Juru Bahasa Python Pergi ke tab Paksa bawaan Klik pada Baru ... Ketikkan nama modul (kutukan dalam kasus saya) dan klik OK

langkah 3) Klik kanan pada penjelajah proyek pada modul mana saja yang memberikan kesalahan. Pergi ke PyDev-> Analisis kode.

SJP
sumber
bekerja untuk saya juga, terima kasih telah membuat setiap langkah lebih eksplisit daripada dalam jawaban yang saat ini diterima.
sc28
1

Saya memiliki masalah yang sama. Saya menggunakan Python dan Eclipse di Windows. Kode berjalan dengan baik, tetapi gerhana menunjukkan kesalahan di mana-mana. Setelah saya mengubah nama folder 'Lib' menjadi 'lib' (C: \ Python27 \ lib), masalahnya terpecahkan. Tampaknya jika kapitalisasi huruf tidak cocok dengan yang ada di file konfigurasi, ini kadang-kadang akan menyebabkan masalah (tapi sepertinya tidak selalu, karena pengecekan kesalahan baik-baik saja untuk waktu yang lama sebelum masalah tiba-tiba muncul tanpa jelas. alasan).

Leon
sumber
4
Ini adalah hobi favorit Eclipse. Membuat bendera kesalahan tiba-tiba muncul tanpa alasan. Ini membuat orang-orang gila berpikir bahwa mereka telah menghancurkan DUNIA, kecuali itu adalah bendera kesalahan yang tidak masuk akal yang tiba-tiba Eclipse memutuskan untuk menerapkannya secara acak untuk kesenangan dan keuntungan (?)
R Thiede
Saya mencoba ini, dan berpikir itu berhasil, tapi itu hanya tipuan , tetapi butuh> 5 menit, jadi saya tidak bisa membatalkan. Namun @ Fabio Zadrozny ctrl-1 @UndefinedVariable bekerja dengan sempurna, dan itu terus bekerja bahkan setelah 5 menit!
Mark Mikofski
1

Perkiraan apa yang saya lakukan:

import module.submodule

class MyClass:
    constant = submodule.constant

Yang dikatakan pylint: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Saya menyelesaikan ini dengan mengubah impor saya seperti:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Catatan: Saya juga mengganti nama dengan variabel yang diimpor untuk memiliki nama huruf besar untuk mencerminkan sifatnya yang konstan.

ThorSummoner
sumber
0

Mungkin saja Anda hanya perlu mengkonfigurasi ulang jalur python Anda di dalam Eclipse. Lihat jawaban saya untuk pertanyaan serupa.

oob
sumber
0

dalam preferensi -> PyDev -> PyLint di bawah argumen untuk lolos ke PyLint tambahkan baris ini:

--generated-members=objects

Anda harus melakukan ini untuk setiap yang dihasilkan. Saya menemukan ini dengan googling, tetapi saya kehilangan referensi.

Mark Mikofski
sumber
0

Klik kanan pada penjelajah proyek pada modul mana saja yang memberikan kesalahan. Pergi ke PyDev-> Hapus Penanda Kesalahan.

Chet
sumber
0

Jawaban saya tidak menyumbangkan sesuatu yang baru, hanya contoh konkret yang saya temui.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev menunjukkan pesan kesalahan "Variabel tidak terdefinisi dari impor: get_default_root_window ()"

Dalam shell python Anda dapat melihat bahwa ini adalah modul 'built-in' seperti yang disebutkan dalam jawaban di atas:

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

Sekarang di bawah Window-> Preferences-> PyDev-> Interpreters-> Python Interpreter, saya memilih tab 'Forced Builtins' dan menambahkan 'gtk.gdk' ke daftar.

Sekarang pesan kesalahan tidak muncul lagi.

Chrimuelle
sumber
0

Saya menemukan bahwa 2 langkah ini bekerja untuk saya sepanjang waktu:

  1. Konfirmasikan (lain tambahkan) folder induk modul ke PYTHONPATH.
  2. Tambahkan nama FULL dari modul ke builtin paksa.

Hal-hal yang perlu diperhatikan di sini:

  • Beberapa modul populer dipasang dengan beberapa pasangan orangtua dan anak dengan nama yang sama. Dalam kasus ini Anda juga harus menambahkan orang tua itu ke PYTHONPATH, di samping folder kakek-neneknya, yang sudah Anda konfirmasi / tambahkan untuk yang lainnya.

  • Gunakan (misalnya) "google.appengine.api.memcache" saat menambahkan ke builtin paksa, BUKAN "memcache" saja, di mana "google" dalam contoh ini, adalah anak langsung dari folder yang ditentukan dalam PYTHONPATH.

Aikude
sumber
Bagaimana saya dapat menambahkan lib.site-Packages._pytest ke dalam paksa builtin ... tidak menerima simbol '-' ... Saya mengalami masalah impor dengan modul konfigurasi dan mencoba melakukan perbaikan Anda, tolong bantu
semangat