ปัญหาการนำเข้าที่ไม่ได้รับการแก้ไขกับ PyDev และ Eclipse


108

ฉันใหม่มากกับ PyDev และ Python แม้ว่าฉันจะใช้ Eclipse กับ Java มากมาย ฉันพยายามทำงานผ่านตัวอย่าง Dive Into Python และรู้สึกว่าเป็นปัญหาที่ไม่สำคัญอย่างยิ่งที่กลายเป็นเรื่องน่ารำคาญอย่างมาก ฉันใช้ Ubuntu Linux 10.04

ฉันต้องการใช้ไฟล์ odbchelper.py ซึ่งอยู่ในไดเร็กทอรี /Desktop/Python_Tutorials/diveintopython/py

นี่คือไฟล์ example.py ของฉันที่ฉันกำลังทำงานอยู่ในโครงการ PyDev / Eclipse ของฉัน:

import sys
sys.path.append("~/Desktop/Python_Tutorials/diveintopython/py")

ใช้งานได้ดี แต่ฉันต้องการให้บรรทัดถัดไปของรหัสเป็น:

import odbchelper

และทำให้เกิดข้อผิดพลาดในการนำเข้าที่ไม่ได้รับการแก้ไขทุกครั้ง ฉันได้เพิ่ม__init__.pyไฟล์ไปเพียงเกี่ยวกับทุกไดเรกทอรีที่เป็นไปได้และมันก็ไม่ได้ช่วยอะไร ฉันได้ลองเพิ่ม__init__.pyไฟล์ทีละไฟล์ในระดับต่างๆของไดเร็กทอรีระหว่างตำแหน่งโปรเจ็กต์และไฟล์ odbchelper.py และฉันได้ลองเพิ่ม__init__.pyไฟล์ไปยังไดเร็กทอรีทั้งหมดพร้อมกัน ไม่ทำงาน

สิ่งที่ฉันต้องการทำคือมีโปรเจ็กต์อยู่ที่ไหนสักแห่งในไดเร็กทอรีอื่นพูด/Desktop/MyStuff/Projectซึ่งฉันมี example.py ... จากนั้นจาก example.py ฉันต้องการนำเข้า odbchelper.py จาก/Desktop/Python_Tutorials/diveintopython/py/

ทุกคำตอบของกระดานข้อความฉันพบเพียงแค่บอกว่าให้ใช้sys.path.append()ฟังก์ชันเพื่อเพิ่มไดเรกทอรีนี้ในเส้นทางของฉันแล้วนำเข้า ... แต่นั่นเป็นสิ่งที่ฉันทำในรหัสของฉันอย่างแม่นยำและมันไม่ทำงาน

ฉันได้ลองใช้Ctrl- 1เคล็ดลับเพื่อระงับข้อความแสดงข้อผิดพลาดแล้ว แต่โปรแกรมยังทำงานไม่ถูกต้อง ฉันได้รับข้อผิดพลาดImportError: No module named odbchelper. ดังนั้นจึงไม่ได้รับการเพิ่มเส้นทางอย่างชัดเจนหรือมีปัญหาบางอย่างที่การเรียงลำดับ__init__.pyไฟล์จำนวนมากของฉันพลาดไป

มันน่าผิดหวังมากที่สิ่งที่เรียบง่ายนี้ ... การเรียกสิ่งต่างๆจากไฟล์บางไฟล์ที่มีอยู่ที่อื่นในเครื่องของฉัน ... ต้องใช้ความพยายามมากขนาดนี้


ตรวจสอบให้แน่ใจว่าตัวพิมพ์ (ตัวพิมพ์ใหญ่) ถูกต้องสำหรับไดเร็กทอรีที่จำเป็นทั้งหมดใน PYTHONPATH ของคุณ
Cam Jackson

ฉันรู้ว่าได้รับคำตอบแล้ว แต่ฉันไม่ได้รับการแก้ไขการนำเข้าสำหรับgrpโมดูล ฉันเพิ่งเพิ่มลงในbuiltinsรายการใน Preferences> PyDev> Interpreters> Python> Forced Builtins และยังคงได้รับการเติมข้อความอัตโนมัติสำหรับโมดูลนั้น
user1040495

คำตอบ:


132

ในคุณสมบัติสำหรับโปรเจ็กต์ pydev ของคุณมีบานหน้าต่างที่เรียกว่า "PyDev - PYTHONPATH" โดยมีบานหน้าต่างย่อยที่เรียกว่า "ไลบรารีภายนอก" คุณสามารถเพิ่มโฟลเดอร์ต้นทาง (โฟลเดอร์ใดก็ได้ที่มี__init__.py) ไปยังเส้นทางโดยใช้บานหน้าต่างนั้น จากนั้นรหัสโครงการของคุณจะสามารถนำเข้าโมดูลจากโฟลเดอร์ต้นทางเหล่านั้นได้


4
หากคุณตั้งค่าคุณสมบัติ pydev อย่างถูกต้องคุณไม่จำเป็นต้องยุ่งกับsys.path
Velociraptors

6
สำหรับผู้ค้นหารายอื่นฉันต้องการเพิ่มประสบการณ์ของฉัน -Windows 7, Python 2.7.1, Eclipse 3.6.2, PyDev, Pyschopg (สำหรับ Python 2.7 amd64) การติดตั้ง Psychopg ไปที่ C: \ Python27 \ Lib \ site-Packages \ psycopg2 (ภายใต้การติดตั้ง Python 2.7) ก่อนอื่นฉันอ้างถึงโฟลเดอร์นั้นและโฟลเดอร์ย่อยทั้งหมดด้วยinit .py แต่พบว่าฉันต้องอ้างอิงโฟลเดอร์ site_packages ด้วย ( stackoverflow.com/questions/2983088/unresolved-import-models ) ( stackoverflow.com/questions/4631377/… )
Jeff Maass

86
อีกหนึ่งประเด็นที่ควรทราบ - Eclipse อาจต้องเริ่มต้นใหม่เพื่อให้สามารถใช้งานได้ ดูเหมือนว่าจะทำงานผ่าน "ไฟล์ -> รีสตาร์ท" เท่านั้นไม่ใช่โดยการปิดและเปิดใหม่ด้วยตนเอง
soulBit

18
หมายเหตุสำคัญ:ฉันพบว่าล่าม Auto Config เพิ่มC:\Python27\lib\site-packagesแต่ในคอมพิวเตอร์ของฉันโฟลเดอร์ lib C:\Python27\Lib\site-packagesเป็นทุน: การแทนที่รายการตัวพิมพ์เล็กด้วยตัวพิมพ์ใหญ่จากนั้นไฟล์ -> รีสตาร์ทช่วยแก้ปัญหาให้ฉัน หวังว่าจะช่วยคนอื่นได้นะ :)
Cam Jackson

10
@soulBit ฉันหวังว่าฉันจะยกนิ้วโป้งที่แสดงความคิดเห็นได้ 20 ครั้งฉันใช้เวลาหนึ่งชั่วโมงในการพยายามหาสาเหตุว่าทำไมการนำเข้าของฉันถึงยังไม่ได้รับการแก้ไข ขอบคุณ
Matt Dodge

51

ฉันใช้ eclipse kepler 4.3, PyDev 3.9.2 และบน ubuntu 14.04 ของฉันฉันพบกับปัญหาเดียวกัน ฉันพยายามและใช้เวลาหลายชั่วโมงกับตัวเลือกส่วนใหญ่ทั้งหมดข้างต้น แต่ก็ไร้ผล จากนั้นฉันก็ลองทำสิ่งต่อไปนี้ซึ่งดีมาก:

  • เลือกProject -> RightClick-> PyDev -> Remove PyDev Project Config
  • ไฟล์ -> รีสตาร์ท

และฉันใช้ Python 2.7 เป็นล่ามแม้ว่าจะไม่มีผล แต่ฉันคิดว่า


5
ไม่จำเป็นต้องรีสตาร์ท Eclipse เพียงแค่ปิดและเปิดไฟล์ใหม่ มันทำงานบน Windows กับ Eclipse Luna ได้ด้วยขอบคุณ!
Noam Manos

ฉันต้องรีสตาร์ท Eclipse สองครั้งเพื่อให้คำเตือนหายไป ขอบคุณ
Vladimir S.

ทำงานร่วมกับ Python 3.7 ได้เช่นกัน นี่น่าจะเป็นทางออกสำหรับคำถามนี้
SPRBRN

ฉันลองแล้วและตอนนี้ฉันไม่สามารถเริ่มเซิร์ฟเวอร์ DEV ได้ ฉันจะแทนที่ไฟล์ได้อย่างไร
Lee Loftiss

@ BitByty-Bake สาเหตุที่แท้จริงคืออะไร?
ankostis

42

ฉันเพิ่งอัปเกรดโครงการ WXWindows เป็น Python 2.7 และไม่มีปัญหาในการทำให้ Pydev รู้จักล่ามใหม่ ทำสิ่งเดียวกับข้างต้นในการกำหนดค่าล่ามทำการติดตั้ง Eclipse และ Pydev ใหม่ คิดว่าบางส่วนของ python ต้องเสียหายดังนั้นฉันจึงติดตั้งทุกอย่างใหม่อีกครั้ง อ๊าก! ปิดและเปิดโปรเจ็กต์อีกครั้งและรีสตาร์ท Eclipse ระหว่างการเปลี่ยนแปลงทั้งหมดนี้

สังเกตในที่สุดคุณสามารถ 'ลบการกำหนดค่าโครงการ PyDev' ได้โดยคลิกขวาที่โครงการ จากนั้นก็สามารถทำเป็นโครงการ PyDev ได้อีกครั้งตอนนี้ดีเหมือนทอง!


ใช่ปิดและเปิดโครงการอีกครั้งเพื่อกำจัดข้อความ ImportError ที่รบกวนนั้น
somnathchakrabarti

17

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

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


ใช้งานได้ดีโดยใช้ liclipse กับ odoo 10 ขอบคุณ!
Didierh

11

โครงการ -> คุณสมบัติ -> pydev-pythonpath -> ไลบรารีภายนอก -> เพิ่มโฟลเดอร์ซอร์สเพิ่มโฟลเดอร์ PARENT ของโปรเจ็กต์ จากนั้นรีสตาร์ท eclipse


2
นี่คือสิ่งที่แก้ไขปัญหาของฉัน
Simon Hayward

ไม่จำเป็นต้องรีสตาร์ทเพียงแค่ปิดและเปิดไฟล์ใหม่ แก้ไขให้ฉัน!
Jerther

4

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน (sugested by soulBit):

1) Restart using restart from the file menu
2) Once it started again, manually close and open it.

นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดและขจัดสิ่งที่น่ารำคาญออกไปได้อย่างสมบูรณ์


1

มีสองวิธีในการแก้ปัญหานี้:

  • ลบตัวแปล Python จาก "Python interpreter" และเพิ่มอีกครั้ง
  • หรือเพียงแค่เพิ่มโฟลเดอร์ที่มีไลบรารีในล่ามที่คุณใช้ในโครงการของคุณในกรณีของฉันฉันใช้ "bottle" และโฟลเดอร์ที่ฉันเพิ่มคือ "c: \ Python33 \ Lib \ site-Packages \ bottle-0.11.6 -py3.3.egg "

ตอนนี้ฉันไม่เห็นข้อผิดพลาดอีกต่อไปและฟีเจอร์การเติมโค้ดก็ใช้ได้กับ "ขวด" เช่นกัน


1

ฉันใช้ Eclipse 4.2.0 (Juno) และ PyDev 2.8.1 และพบปัญหานี้ด้วย lib ที่ติดตั้งในพา ธ ไซต์แพ็กเกจของฉัน ตามคำถาม SO นี้:

ไฟล์ Pydev และ * .pyc

... มีปัญหากับไฟล์ PyDev และ pyc ในกรณีของ lib เฉพาะที่ฉันพยายามอ้างอิงสิ่งที่ส่งมอบคือไฟล์ pyc

นี่คือสิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้:

  1. ติดตั้ง uncompyle2 จากhttps://github.com/Mysterie/uncompyle2
  2. รัน uncompyle2 กับไฟล์ * .pyc ใน site-package lib ตัวอย่าง:

    uncompyle2 -r -o / tmp / path / to / site-Packages / lib

  3. เปลี่ยนชื่อไฟล์ผลลัพธ์ * .pyc_dis ที่สร้างจาก uncompyle2 เป็น * .py
  4. ย้าย / คัดลอกไฟล์ * .py เหล่านี้ไปยังเส้นทางไซต์แพ็กเกจ
  5. ใน Eclipse เลือกไฟล์> รีสตาร์ท

ข้อผิดพลาดในการนำเข้าที่ไม่ได้รับการแก้ไขที่เกี่ยวข้องกับไฟล์. pyc ควรหายไป


0

ต่อไปนี้ในความคิดของฉันจะแก้ปัญหาได้

  1. การเพิ่มinit .py ลงในโฟลเดอร์ "~ / Desktop / Python_Tutorials / diveintopython / py"
  2. ไปที่ Window -> Preferences -> PyDev -> Interpreters -> Python Interpreter เพื่อลบการตั้งค่า Python Interpreter ของคุณ (สาเหตุเป็นเพราะ PyDev ไม่สามารถรีเฟรชการอัปเดตใด ๆ ที่เกิดขึ้นกับ System PythonPath โดยอัตโนมัติ)
  3. เพิ่ม Interpreter ด้วยรายละเอียดเดียวกันกับก่อนหน้านี้ (จะรีเฟรชการตั้งค่า Python Interpreter ของคุณด้วยการอัปเดตที่ทำกับ PythonPath ของคุณ)
  4. ในที่สุดเนื่องจากโฟลเดอร์ "~ / Desktop / Python_Tutorials / diveintopython / py" ของคุณไม่ใช่ PythonPath มาตรฐานคุณจะต้องเพิ่มเข้าไปมีสองวิธีในการดำเนินการ

ก. ตามสิ่งที่ David German แนะนำ อย่างไรก็ตามสิ่งนี้ใช้ได้กับโครงการเฉพาะที่คุณอยู่ใน b เพิ่ม "~ / Desktop / Python_Tutorials / diveintopython / py" ลงใน PythonPath ใหม่ภายใต้ Window -> Preferences -> PyDev -> Interpreters -> Python Interpreter -> แท็บย่อย Libraries -> NewFolder

หวังว่าจะช่วยได้


0

ฉันมีปัญหาในการนำเข้าไลบรารีเพิ่มเติมหลังจากพยายามแก้ไขปัญหาโดยการทำความเข้าใจ PYTHONPATH, Interpreter และ Grammar ฉันพบว่าฉันเขียนทุกอย่างแล้วแต่ปัญหายังคงดำเนินต่อไป หลังจากนั้นฉันก็เพิ่มบรรทัดว่างใหม่ในไฟล์ที่มีข้อผิดพลาดในการนำเข้าและบันทึกไว้และข้อผิดพลาดได้รับการแก้ไขแล้ว


-1
KD.py

class A:
a=10;

KD2.py 
from com.jbk.KD import A;
class B:
  b=120;

aa=A();
print(aa.a)

ไฟล์นี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

อีกตัวอย่างหนึ่งคือ

main.py
=======
from com.jbk.scenarios.objectcreation.settings import _init
from com.jbk.scenarios.objectcreation.subfile import stuff

_init();
stuff();

settings.py
==========
def _init():
print("kiran")


subfile.py
==========
def stuff():
print("asasas")    

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