Làm cách nào để sửa lỗi Biến không xác định của PyDev từ lỗi nhập khẩu?


138

Tôi đã có một dự án Python sử dụng PyDev trong Eclipse và PyDev tiếp tục tạo ra các lỗi sai cho mã của tôi. Tôi có một mô-đun settingsxác định một settingsđối tượng. Tôi nhập nó trong mô-đun bvà gán một thuộc tính với:

from settings import settings
settings.main = object()

Trong một số mã của tôi - nhưng không phải tất cả mã, các câu như:

from settings import settings
print settings.main 

... Tạo các thông báo "Không xác định từ nhập: chính" trong ngăn lỗi mã Eclipse, mặc dù mã chạy mà không gặp vấn đề gì. Làm thế nào tôi có thể sửa những điều này?


Tôi đã không thấy bất cứ điều gì liên quan đến môn vị trong những câu trả lời sau: \ Tôi nghĩ đó là thông báo này bắt nguồn từ đâu và tôi đã hy vọng tìm ra cách nói với pylint rằng đó không phải là biến, đó là một bản nhập khẩu.
ThorSummoner

Câu trả lời:


156

Đối với mã trong dự án của bạn, cách duy nhất là thêm một khai báo nói rằng bạn mong đợi rằng - có thể được bảo vệ bởi if Falsenó không thực thi (phân tích mã tĩnh chỉ nhìn thấy những gì bạn thấy, không phải thông tin thời gian chạy - nếu bạn đã tự mở mô-đun đó, bạn sẽ không có dấu hiệu nào cho thấy chính được mong đợi).

Để khắc phục điều này có một số lựa chọn:

  1. Nếu đó là một số mô-đun bên ngoài, có thể thêm nó vào forced builtinsđể PyDev sinh ra một vỏ để lấy thông tin thời gian chạy (xem http://pydev.org/manual_101_interpreter.html để biết chi tiết) - ví dụ: chủ yếu, PyDev sẽ nhập mô-đun vào hệ vỏ và thực hiện một dir(module)dirtrên các lớp được tìm thấy trong mô-đun để trình bày hoàn thành và thực hiện phân tích mã.

  2. Bạn có thể sử dụng Ctrl + 1 (Cmd + 1 cho Mac) trong một dòng có lỗi và PyDev sẽ đưa ra cho bạn một tùy chọn để thêm nhận xét để bỏ qua lỗi đó.

  3. Có thể tạo một stubmô-đun và thêm nó vào phần predefinedhoàn thành ( http://pydev.org/manual_101_interpreter.html cũng có chi tiết về điều đó).


1
đôi khi việc thêm một mô-đun vào các nội dung bắt buộc không giúp ích được gì (xem lỗi này, ví dụ như sourceforge.net/tracker/iêu )
Boris Gorelik

@Fabio: Những gì về hoàn thành được xác định trước họ có thể được sử dụng ở đây? Và có những lựa chọn nào nếu bạn làm một cái gì đó như try: import a; except: a=mockModulecó cách nào để loại bỏ những thứ này mà không có ý kiến?
ted

8
Tôi đã thử Ctrl-1, nó mang lại cho tôi '@UndDefVariable', có thêm một chú thích và nó hoạt động. Cảm ơn.
RichMeister

Tôi đang gặp vấn đề tương tự với Eclipse và PyDev mới nhất. Tôi có thể điều hướng giữa tất cả các mô-đun, vậy tại sao phân tích mã không thể làm như vậy?
Adam

3
Trước khi bạn đi đến cực đoan, hãy đảm bảo thư mục nằm trong PYTHONPATH, sau đó thoát / khởi động lại Eclipse, thực hiện Project> Pydev> Xóa các dấu lỗi và bây giờ sẽ xuất hiện trong các phần tử cưỡng bức.
smci

49

Tôi đang sử dụng opencv dựa trên nhị phân, v.v. vì vậy tôi có các tập lệnh trong đó mọi dòng khác đều có lỗi ngớ ngẩn này. Python là một ngôn ngữ động vì vậy những dịp như vậy không nên được coi là lỗi.

Tôi đã loại bỏ các lỗi này hoàn toàn bằng cách đi đến:

Cửa sổ -> Tùy chọn -> PyDev -> Trình chỉnh sửa -> Phân tích mã -> Không xác định -> Biến không xác định từ nhập -> Bỏ qua

Và đó là điều đó.

Nó cũng có thể là, Cửa sổ -> Tùy chọn -> PyDev -> Trình chỉnh sửa -> Phân tích mã -> Nhập khẩu -> Không tìm thấy nhập -> Bỏ qua


8
Cảm ơn vì điều đó. Nó rất đơn giản và dễ dàng. Tuy nhiên, thay vì thay đổi cài đặt "Nhập không tìm thấy" thành "Bỏ qua", tôi đã thay đổi thành "Cảnh báo". NGAY BÂY GIỜ KHÔNG HIỂN THỊ. :) Hy vọng, tôi sẽ nhận được Cảnh báo nếu gặp sự cố nhập thực tế.
Tình yêu và hòa bình - Joe Codwell

1
Phải khởi động lại Eclipse để các thay đổi có hiệu lực.
spettekaka

21

Bài đăng được đánh dấu là câu trả lời cho một cách giải quyết, không phải là một giải pháp.

Giải pháp này hiệu quả với tôi:

  • Đi đến Window - Preferences - PyDev - Interpreters - Python Interpreter
  • Chuyển đến Forced builtinstab
  • Bấm vào New...
  • Nhập tên của mô-đun ( multiprocessingtrong trường hợp của tôi) và nhấp vàoOK

Không chỉ các thông báo lỗi sẽ biến mất, các thành viên mô-đun cũng sẽ được nhận ra.


1
Xem xét rằng "bài đăng được đánh dấu là câu trả lời" được viết bởi nhà phát triển của PyDev, có lẽ bạn nên xem xét lại về nó. Anh ấy không đưa ra hướng dẫn rõ ràng trong bài viết bởi vì anh ấy liên kết với các hướng dẫn bạn đã chỉ định.
coredumperror

5
@CoreDumpError Tôi không quan tâm ai đã viết bài đăng. Tôi đã thử những gì bài viết mô tả, và nó hoạt động, nhưng là một cách giải quyết, không phải là một giải pháp. Những gì tôi mô tả có thể không hoạt động cho các máy tính khác, nhưng hoạt động với tôi và là giải pháp chính xác. Nếu bài đăng khác liên kết đến giải pháp thay vì mô tả nó, thì nó không tuân theo hướng dẫn, tôi đã làm theo hướng dẫn bằng cách mô tả đâu là giải pháp tốt cho tôi, hy vọng điều đó sẽ giúp ích cho người khác.
stenci

2
@Isaac Bây giờ, tôi đã đăng câu trả lời của mình trước khi nó được chỉnh sửa.
stenci

Vâng, đây là giải pháp tốt hơn và sạch hơn nhiều! Thay vì che dấu hoặc che giấu nó cung cấp sửa chữa hợp pháp. Tôi đã phải thêm renhưng một khi tôi không còn viết mực đỏ cho những thứ nhưre.M
Bostone

10

Tôi đã gặp một vấn đề tương tự với một dự án Eclipse / PyDev. Trong dự án này, thư mục gốc của mã python là một thư mục con của dự án.

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

Khi dự án được gỡ lỗi hoặc chạy, mọi thứ đều ổn vì thư mục làm việc được đặt đúng vị trí. Tuy nhiên, phân tích mã PyDev đã không tìm thấy bất kỳ nhập khẩu nào từ module1 hoặc module2.

Giải pháp là chỉnh sửa các thuộc tính của dự án -> phần PyDev - PYTHONPATH và xóa / MyProject khỏi tab thư mục nguồn và thêm / MyProject / src vào đó.


Chỉ muốn cung cấp xác minh rằng trên thực tế hoạt động hoàn hảo.
Amndeep7

Đúng, chỉ cần vào menu chính Project / Properties / PyDev - PYTHONPATH và thêm tất cả các đường dẫn cần thiết cho ứng dụng, giải quyết vấn đề!
Kostyantyn

6

Điều này làm việc cho tôi:

Bước 1) Gỡ bỏ trình thông dịch, tự động cấu hình lại nó

bước 2) Cửa sổ - Tùy chọn - PyDev - Thông dịch viên - Trình thông dịch Python Chuyển đến tab Nội dung cưỡng bức Nhấp vào Mới ... Nhập tên của mô-đun (nguyền rủa trong trường hợp của tôi) và nhấp vào OK

Bước 3) Nhấp chuột phải vào trình thám hiểm dự án trên bất kỳ mô-đun nào đang đưa ra lỗi. Chuyển đến PyDev-> Phân tích mã.


cũng làm việc cho tôi, cảm ơn vì đã làm cho mỗi bước rõ ràng hơn trong câu trả lời hiện được chấp nhận.
sc28

1

Tôi đã từng gặp vấn đề tương tự. Tôi đang sử dụng Python và Eclipse trên Windows. Mã đã chạy tốt, nhưng nhật thực hiển thị lỗi ở khắp mọi nơi. Sau khi tôi thay đổi tên của thư mục 'Lib' thành 'lib' (C: \ Python27 \ lib), vấn đề đã được giải quyết. Có vẻ như nếu viết hoa của các chữ cái không khớp với chữ cái trong tệp cấu hình, điều này đôi khi sẽ gây ra sự cố (nhưng có vẻ như không phải lúc nào cũng được, vì việc kiểm tra lỗi vẫn ổn trong một thời gian dài trước khi các vấn đề đột nhiên xuất hiện không rõ ràng lý do).


4
Đây là trò tiêu khiển yêu thích của Eclipse. Làm cờ lỗi đột nhiên xuất hiện mà không có lý do. Nó khiến mọi người nghĩ rằng họ đã phá vỡ THẾ GIỚI, ngoại trừ một số cờ lỗi vô nghĩa mà Eclipse đã bất ngờ quyết định thực hiện ngẫu nhiên để giải trí và kiếm lợi nhuận (?)
R Thiede

Tôi đã thử điều này và nghĩ rằng nó đã hoạt động, nhưng nó chỉ là một mưu mẹo , nhưng mất> 5 phút, vì vậy tôi không thể hoàn tác. Tuy nhiên @ Fabio Zadrozny ctrl-1 @Und xác địnhVariable hoạt động hoàn hảo và nó vẫn tiếp tục hoạt động ngay cả sau 5 phút!
Đánh dấu Mikofski

1

Một sự gần đúng về những gì tôi đã làm:

import module.submodule

class MyClass:
    constant = submodule.constant

Mà pylint nói: E: 4,15: Undefined variable 'submodule' (undefined-variable)

Tôi đã giải quyết điều này bằng cách thay đổi nhập khẩu của mình như sau:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

Lưu ý: Tôi cũng đổi tên bằng biến nhập để có tên viết hoa để phản ánh bản chất không đổi của nó.


0

Có thể bạn chỉ cần cấu hình lại đường dẫn python của bạn trong Eclipse. Xem câu trả lời của tôi cho một câu hỏi tương tự.


0

trong tùy chọn -> PyDev -> PyLint theo các đối số để chuyển cho PyLint thêm dòng này:

--generated-members=objects

bạn sẽ cần phải làm điều này cho mỗi lần tạo. Tôi tìm thấy điều này bằng cách googling, nhưng tôi đã mất tài liệu tham khảo.


0

Nhấp chuột phải vào trình thám hiểm dự án trên bất kỳ mô-đun nào đang đưa ra lỗi. Chuyển đến PyDev-> Xóa các dấu lỗi.


0

Câu trả lời của tôi không đóng góp gì mới, chỉ là một ví dụ cụ thể mà tôi gặp phải.

import gtk.gdk

w = gtk.gdk.get_default_root_window()

PyDev đã hiển thị thông báo lỗi "Biến không xác định từ import: get_default_root_window ()"

Trong shell python, bạn có thể thấy rằng đây là mô-đun 'tích hợp' như được đề cập trong câu trả lời ở trên:

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

Bây giờ trong Window-> Preferences-> PyDev-> Interpreter-> Python Interpreter, tôi đã chọn tab 'Buộc cưỡng bức' và thêm 'gtk.gdk' vào danh sách.

Bây giờ thông báo lỗi không hiển thị nữa.


0

Tôi thấy rằng 2 bước này hoạt động với tôi mọi lúc:

  1. Xác nhận (khác thêm) thư mục mẹ của mô-đun vào PYTHONPATH.
  2. Thêm tên ĐẦY ĐỦ của mô-đun vào nội dung bắt buộc.

Những điều cần lưu ý ở đây:

  • Một số mô-đun phổ biến cài đặt với một số cặp cha mẹ và con có cùng tên. Trong những trường hợp này, bạn cũng phải thêm cha mẹ đó vào PYTHONPATH, ngoài thư mục ông bà của nó, mà bạn đã xác nhận / thêm cho mọi thứ khác.

  • Sử dụng (ví dụ) "google.appengine.api.memcache" khi thêm vào các nội dung bắt buộc, KHÔNG chỉ "memcache", trong đó "google" trong ví dụ này, là con ngay lập tức của thư mục được xác định trong PYTHONPATH.


Làm cách nào tôi có thể thêm lib.site-gói._pytest vào các nội dung bắt buộc ... nó không chấp nhận biểu tượng '-' ... Tôi đang gặp sự cố nhập với mô-đun cấu hình và cố gắng khắc phục, vui lòng trợ giúp
nhiệt tình

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.