ฉันจะแก้ไขข้อผิดพลาด“ ไม่ได้กำหนดตัวแปรจากการนำเข้า” PyDev ได้อย่างไร?


138

ฉันมีโครงการ Python ที่ใช้ PyDev ใน Eclipse และ PyDev ยังคงสร้างข้อผิดพลาดที่ผิดพลาดสำหรับรหัสของฉัน ฉันมีโมดูลsettingsที่กำหนดsettingsวัตถุ ฉันนำเข้าสิ่งนั้นในโมดูลbและกำหนดแอตทริบิวต์ด้วย:

from settings import settings
settings.main = object()

ในบางรหัสของฉัน - แต่ไม่ใช่ทั้งหมด, ข้อความสั่ง:

from settings import settings
print settings.main 

... สร้างข้อความ "ไม่ได้กำหนดตัวแปรจากการนำเข้า: หลัก" ในบานหน้าต่างข้อผิดพลาดรหัส Eclipse แม้ว่ารหัสจะทำงานโดยไม่มีปัญหา ฉันจะแก้ไขสิ่งเหล่านี้ได้อย่างไร


ฉันไม่เห็นอะไรเกี่ยวกับไพลินในคำตอบเหล่านี้: \ ฉันคิดว่านั่นเป็นที่มาของคำบอกกล่าวนี้และฉันก็หวังที่จะหาวิธีบอกไพลินต์ว่าไม่มีตัวแปรมันเป็นการนำเข้า
ThorSummoner

คำตอบ:


156

สำหรับรหัสในโครงการของคุณวิธีเดียวที่จะเพิ่มประกาศที่บอกว่าคุณคาดหวังว่า - อาจได้รับการปกป้องโดยif Falseสิ่งที่ไม่ได้ดำเนินการ (การวิเคราะห์รหัสคงที่จะเห็นเฉพาะสิ่งที่คุณเห็นไม่ใช่ข้อมูลรันไทม์ - หากคุณ เปิดโมดูลนั้นด้วยตัวคุณเองคุณจะไม่มีสิ่งบ่งชี้ว่าเป็นสิ่งที่คาดหวังไว้)

เพื่อเอาชนะสิ่งนี้มีทางเลือกบางอย่าง:

  1. หากเป็นโมดูลภายนอกก็เป็นไปได้ที่จะเพิ่มลงไปforced builtinsเพื่อให้ PyDev วางเปลือกเพื่อให้ได้ข้อมูลรันไทม์ (ดูที่http://pydev.org/manual_101_interpreter.htmlเพื่อดูรายละเอียด) - เช่น: ส่วนใหญ่ PyDev จะ อิมพอร์ตโมดูลในเชลล์และทำ a dir(module)และdirบนคลาสที่พบในโมดูลเพื่อแสดงความสมบูรณ์และทำการวิเคราะห์โค้ด

  2. คุณสามารถใช้ Ctrl + 1 (Cmd + 1 สำหรับ Mac) ในบรรทัดที่มีข้อผิดพลาดและ PyDev จะแสดงตัวเลือกให้คุณเพื่อเพิ่มความคิดเห็นเพื่อละเว้นข้อผิดพลาดนั้น

  3. เป็นไปได้ที่จะสร้างstubโมดูลและเพิ่มไปยังส่วนที่predefinedสมบูรณ์ ( http://pydev.org/manual_101_interpreter.htmlยังมีรายละเอียดเกี่ยวกับสิ่งนั้น)


1
บางครั้งการเพิ่มโมดูลเพื่อ builtins บังคับไม่ได้ความช่วยเหลือ (ดูข้อผิดพลาดนี้เช่นsourceforge.net/tracker/... )
บอริส Gorelik

@Fabio: พวกเขาสามารถใช้ความสำเร็จที่กำหนดไว้ล่วงหน้าได้ที่นี่ได้อย่างไร และมีทางเลือกอะไรบ้างถ้าคุณทำสิ่งที่ชอบtry: import a; except: a=mockModuleมีวิธีใดที่จะระงับสิ่งเหล่านี้โดยไม่มีความคิดเห็น?
เท็ด

8
ฉันลอง Ctrl-1 มันให้ '@UndefinedVariable' ซึ่งเพิ่มคำอธิบายประกอบและใช้งานได้ ขอบคุณ
RichMeister

ฉันประสบปัญหาเดียวกันกับ Eclipse และ PyDev ล่าสุด ฉันสามารถนำทางระหว่างโมดูลทั้งหมดดังนั้นทำไมการวิเคราะห์รหัสไม่สามารถทำเช่นเดียวกันได้
อดัม

3
ก่อนที่คุณจะไปสุดขั้วให้แน่ใจว่าไดเรกทอรีนั้นอยู่ใน PYTHONPATH จากนั้นออกจาก / รีสตาร์ท Eclipse ทำโปรเจ็กต์> Pydev> ลบเครื่องหมายข้อผิดพลาดและตอนนี้ numpy ควรปรากฏใน Forced builtin
smci

49

ฉันกำลังใช้ opencv ซึ่งอาศัยไบนารี ฯลฯ ดังนั้นฉันจึงมีสคริปต์ที่บรรทัดอื่น ๆ มีข้อผิดพลาดโง่ ๆ นี้ Python เป็นภาษาแบบไดนามิกดังนั้นจึงไม่ควรถือว่าข้อผิดพลาดเกิดขึ้น

ฉันลบข้อผิดพลาดทั้งหมดโดยไปที่:

หน้าต่าง -> การตั้งค่า -> PyDev -> ตัวแก้ไข -> การวิเคราะห์รหัส -> ไม่ได้กำหนด -> ตัวแปรที่ไม่ได้กำหนดจากการนำเข้า -> ละเว้น

และนั่นคือสิ่งที่

มันอาจจะเป็นหน้าต่าง -> การตั้งค่า -> PyDev -> แก้ไข -> การวิเคราะห์รหัส -> นำเข้า -> ไม่พบการนำเข้า -> ไม่สนใจ


8
ขอบคุณสำหรับสิ่งนี้. มันง่ายและสะดวก อย่างไรก็ตามแทนที่จะเปลี่ยนการตั้งค่า "นำเข้าไม่พบ" เป็น "ละเว้น" ฉันเปลี่ยนเป็น "คำเตือน" ตอนนี้ไม่มีอะไรแสดง :) หวังว่าฉันจะได้รับคำเตือนถ้าฉันมีปัญหาการนำเข้าของจริง
ความรักและความสงบสุข - Joe Codeswell

1
ต้องรีสตาร์ท Eclipse เพื่อให้การเปลี่ยนแปลงมีผล
spettekaka

21

โพสต์ที่ทำเครื่องหมายว่าเป็นคำตอบจะช่วยแก้ปัญหาไม่ใช่วิธีแก้ปัญหา

วิธีนี้ใช้ได้ผลสำหรับฉัน:

  • ไปที่ Window - Preferences - PyDev - Interpreters - Python Interpreter
  • ไปที่Forced builtinsแท็บ
  • คลิกที่ New...
  • พิมพ์ชื่อของโมดูล ( multiprocessingในกรณีของฉัน) และคลิกOK

ไม่เพียง แต่ข้อความแสดงข้อผิดพลาดจะหายไปสมาชิกโมดูลก็จะถูกจดจำเช่นกัน


1
เมื่อพิจารณาว่า "โพสต์ที่ทำเครื่องหมายเป็นคำตอบ" เขียนโดยนักพัฒนาของ PyDev คุณอาจจะลองดูอีกครั้ง เขาไม่ได้ให้คำแนะนำที่ชัดเจนในโพสต์เองเพราะเขาลิงก์ไปยังคำแนะนำที่คุณระบุ
coredumperror

5
@CoreDumpError ฉันไม่สนใจว่าใครเขียนโพสต์ ฉันลองสิ่งที่โพสต์อธิบายและใช้งานได้ แต่เป็นวิธีแก้ปัญหาไม่ใช่วิธีแก้ปัญหา สิ่งที่ฉันอธิบายอาจใช้ไม่ได้กับคอมพิวเตอร์เครื่องอื่น แต่ใช้งานได้สำหรับฉันและเป็นวิธีแก้ไขที่ถูกต้อง หากโพสต์อื่นลิงก์ไปยังโซลูชันแทนที่จะอธิบายมันก็ไม่ปฏิบัติตามคำแนะนำฉันทำตามแนวทางโดยอธิบายว่าอะไรคือทางออกที่ดีสำหรับฉันโดยหวังว่าจะช่วยผู้อื่น
stenci

2
@Isaac ตอนนี้ฉันก็โพสต์คำตอบก่อนที่จะแก้ไข
stenci

ใช่นี่เป็นวิธีที่ดีกว่าและสะอาดกว่ามาก! แทนที่จะปิดบังหรือซ่อนเร้นมันเสนอการแก้ไขที่ถูกต้อง ฉันต้องเพิ่มreแต่เมื่อฉันไม่ได้ทำหมึกสีแดงสำหรับสิ่งต่าง ๆ อีกต่อไปre.M
Bostone

10

ฉันมีปัญหาคล้ายกันกับโครงการ Eclipse / PyDev ในโครงการนี้ไดเรกทอรีรูตของรหัสไพ ธ อนเป็นไดเรกทอรีย่อยของโครงการ

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

เมื่อโปรเจ็กต์ถูกดีบั๊กหรือรันทุกอย่างเรียบร้อยเนื่องจากไดเร็คทอรี่การทำงานถูกตั้งค่าให้ถูกที่แล้ว อย่างไรก็ตามการวิเคราะห์รหัส PyDev ล้มเหลวในการค้นหาการนำเข้าใด ๆ จาก module1 หรือ module2

วิธีแก้ไขคือการแก้ไขคุณสมบัติโครงการ -> PyDev - PYTHONPATH ส่วนและลบ / MyProject จากแท็บโฟลเดอร์ต้นทางและเพิ่ม / MyProject / src ลงไปแทน


เพียงแค่ต้องการให้การตรวจสอบว่าในความเป็นจริงนี้ทำงานได้อย่างสมบูรณ์
Amndeep7

ใช่เพียงแค่ไปที่เมนูหลักโครงการ / คุณสมบัติ / PyDev - PYTHONPATH และเพิ่มเส้นทางทั้งหมดที่จำเป็นสำหรับแอพซึ่งแก้ไขปัญหา!
Kostyantyn

6

สิ่งนี้ใช้ได้กับฉัน:

ขั้นตอนที่ 1) การถอดล่ามออกโดยอัตโนมัติกำหนดค่าอีกครั้ง

ขั้นตอนที่ 2) หน้าต่าง - ค่ากำหนด - PyDev - ล่าม - Python Interpreter ไปที่แท็บบิวด์อิน Forced คลิกที่ใหม่ ... พิมพ์ชื่อของโมดูล (คำสาปในกรณีของฉัน) และคลิกตกลง

ขั้นตอนที่ 3) คลิกขวาในตัวสำรวจโครงการว่าโมดูลใดให้ข้อผิดพลาด ไปที่ PyDev-> การวิเคราะห์รหัส


ทำงานให้ฉันด้วยขอบคุณที่ทำให้แต่ละขั้นตอนชัดเจนกว่าในคำตอบที่ยอมรับในปัจจุบัน
sc28

1

ผมมีปัญหาเหมือนกัน. ฉันใช้ Python และ Eclipse บน Windows รหัสกำลังทำงานได้ดี แต่ eclipse แสดงข้อผิดพลาดทุกที่ หลังจากฉันเปลี่ยนชื่อโฟลเดอร์ 'Lib' เป็น 'lib' (C: \ Python27 \ lib) ปัญหาได้รับการแก้ไข ดูเหมือนว่าหากการใช้อักษรตัวพิมพ์ใหญ่ไม่ตรงกับตัวอักษรในไฟล์การกำหนดค่าบางครั้งจะทำให้เกิดปัญหา (แต่ดูเหมือนว่าจะไม่เสมอไปเพราะการตรวจสอบข้อผิดพลาดนั้นใช้ได้ผลนานก่อนที่ปัญหาจะปรากฏขึ้นทันที เหตุผล).


4
นี่เป็นงานอดิเรกที่โปรดปรานของ Eclipse การทำเครื่องหมายข้อผิดพลาดปรากฏขึ้นโดยไม่มีเหตุผล มันไดรฟ์ความคิดคนบ้าที่พวกเขายากจนโลกยกเว้นบางธงข้อผิดพลาดเรื่องไร้สาระที่คราสได้ตัดสินใจที่จู่ ๆ ก็จะใช้การสุ่มเพื่อความสนุกสนานและกำไร (?)
R Thiede

ฉันลองสิ่งนี้และคิดว่ามันใช้งานได้ แต่มันเป็นเพียงเล่ห์เหลี่ยมแต่ใช้เวลา> 5 นาทีดังนั้นฉันจึงไม่สามารถยกเลิกได้ อย่างไรก็ตาม @ Fabio Zadrozny ctrl-1 @UndefinedVariable ทำงานได้อย่างสมบูรณ์แบบและยังคงใช้งานได้แม้หลังจาก 5 นาที!
Mark Mikofski

1

การประมาณของสิ่งที่ฉันทำ:

import module.submodule

class MyClass:
    constant = submodule.constant

ไพลินที่ต้องการพูดว่า: E: 4,15: Undefined variable 'submodule' (undefined-variable)

ฉันได้รับการแก้ไขโดยการเปลี่ยนการนำเข้าของฉันเช่น:

from module.submodule import CONSTANT

class MyClass:
    constant = CONSTANT

หมายเหตุ: ฉันยังเปลี่ยนชื่อโดยตัวแปรที่นำเข้าเพื่อให้มีชื่อตัวพิมพ์ใหญ่เพื่อสะท้อนลักษณะคงที่



0

ในการตั้งค่า -> PyDev -> PyLint ภายใต้อาร์กิวเมนต์เพื่อส่งไปยัง PyLintเพิ่มบรรทัดนี้:

--generated-members=objects

คุณจะต้องทำสิ่งนี้สำหรับแต่ละสิ่งที่สร้างขึ้น ฉันพบสิ่งนี้ด้วย googling แต่ฉันทำข้อมูลอ้างอิงหาย


0

คลิกขวาใน project explorer ที่โมดูลใดกำลังให้ข้อผิดพลาด ไปที่ 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)>

ตอนนี้ใต้ Window-> Preferences-> PyDev-> Interpreters-> Python Interpreter ฉันเลือกแท็บ 'Forced Builtins' และเพิ่ม 'gtk.gdk' ลงในรายการ

ตอนนี้ข้อความแสดงข้อผิดพลาดไม่แสดงอีกต่อไป


0

ฉันพบว่า 2 ขั้นตอนเหล่านี้ใช้ได้กับฉันตลอดเวลา:

  1. ยืนยัน (เพิ่มอีก) โฟลเดอร์พาเรนต์ของโมดูลไปยัง PYTHONPATH
  2. เพิ่มชื่อเต็มของโมดูลไปยังบิวด์อินบังคับ

สิ่งที่ควรทราบที่นี่:

  • บางโมดูลยอดนิยมติดตั้งกับผู้ปกครองและเด็กคู่ที่มีชื่อเดียวกัน ในกรณีเหล่านี้คุณต้องเพิ่มพาเรนต์นั้นไปยัง PYTHONPATH นอกเหนือจากโฟลเดอร์ grandparent ที่คุณยืนยัน / เพิ่มสำหรับทุกอย่างแล้ว

  • ใช้ (ตัวอย่าง) "google.appengine.api.memcache" เมื่อเพิ่มไปยัง buildins บังคับไม่ใช่ "memcache" เท่านั้นโดยที่ "google" ในตัวอย่างนี้เป็นชายด์ทันทีของโฟลเดอร์ที่กำหนดใน PYTHONPATH


ฉันจะเพิ่มlib.site-packages._pytestไปยังบังคับbuildins ได้อย่างไร ... มันไม่ยอมรับ '-' สัญลักษณ์ ... ฉันกำลังมีปัญหาการนำเข้าโมดูลปรับแต่งและพยายามแก้ไขปัญหาของคุณโปรดช่วยด้วย
zeal

0

หากคุณแน่ใจว่าสคริปต์ของคุณทำงานและเป็นสัญญาณเตือนที่ผิดพลาดให้ไปที่การตั้งค่า> PyDev> เครื่องมือแก้ไข> การวิเคราะห์รหัส ลดระดับข้อผิดพลาดในการเตือน

ป้อนคำอธิบายรูปภาพที่นี่

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.