Python error“ ImportError: ไม่มีโมดูลชื่อ”


452

Python ถูกติดตั้งในโลคอลไดเร็กทอรี

แผนผังไดเรกทอรีของฉันมีลักษณะเช่นนี้:

(local directory)/site-packages/toolkit/interface.py

รหัสของฉันอยู่ที่นี่:

(local directory)/site-packages/toolkit/examples/mountain.py

ในการรันตัวอย่างฉันเขียนpython mountain.pyและในรหัสฉันมี:

from toolkit.interface import interface

และฉันได้รับข้อผิดพลาด:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

ผมได้ตรวจสอบแล้วและมีฉันมีไดเรกทอรีsys.path /site-packagesนอกจากนี้ฉันมีไฟล์__init__.py.binในโฟลเดอร์ชุดเครื่องมือเพื่อระบุให้ Python ทราบว่านี่เป็นแพ็คเกจ ฉันยังมี__init__.py.binในไดเรกทอรีตัวอย่าง

ฉันไม่รู้ว่าทำไม Python หาไฟล์ไม่เจอเมื่อมันเข้าsys.pathมา ความคิดใด ๆ มันอาจเป็นปัญหาสิทธิ์หรือไม่ ฉันต้องการสิทธิ์ดำเนินการบางอย่างหรือไม่


3
ตรวจสอบว่าคุณได้รับอนุญาตให้อ่านไฟล์จากไพ ธ อน ดู: stackoverflow.com/a/20999950/1657225
cSn

1
โปรดตรวจสอบให้แน่ใจว่าได้ทำเครื่องหมายไดเรกทอรีของคุณเป็น "Root Root" เพื่อให้ PyCharm รู้ว่านี่เป็นแพ็คเกจ
emmmphd

755ปัญหาในกรณีของฉันคือการที่มีสิทธิ์ในการโมดูลที่ติดตั้งใหม่ไม่ได้ นั่นเป็นเพราะumaskในเครื่องเป็น0027เพราะที่othersไม่ได้readรับอนุญาตทำให้โมดูลที่จะไม่อ่าน การเพิ่มการreadอนุญาตแก้ไขปัญหาของฉันได้ ควรตรวจสอบสิทธิ์ของการติดตั้งไดเร็กทอรีเป้าหมายหลังการติดตั้ง
anu


อาจเป็นชื่อไดเรกทอรีท้องถิ่นinterface (มีความขัดแย้ง)
Benyamin Jafari

คำตอบ:


267

จากความคิดเห็นของคุณต่อโพสต์ของ orip ฉันคิดว่านี่เป็นสิ่งที่เกิดขึ้น:

  1. คุณแก้ไข__init__.pyบน windows
  2. ตัวแก้ไข windows เพิ่มสิ่งที่ไม่ใช่การพิมพ์บางที carriage-return (จุดสิ้นสุดของบรรทัดใน Windows คือ CR / LF; ใน unix มันคือ LF เท่านั้น) หรือบางที CTRL-Z (ปลายหน้าต่างของไฟล์)
  3. คุณใช้ WinSCP เพื่อคัดลอกไฟล์ไปยังกล่อง unix ของคุณ
  4. WinSCP คิดว่า: "นี่มีบางอย่างที่ไม่ใช่ข้อความพื้นฐานฉันจะใส่นามสกุล. bin เพื่อระบุข้อมูลไบนารี"
  5. ที่หายไป__init__.py(เรียกว่า__init__.py.bin) หมายความว่าหลามไม่เข้าใจชุดเครื่องมือเป็นแพคเกจ
  6. คุณสร้าง__init__.pyในไดเรกทอรีที่เหมาะสมและทุกอย่างทำงาน ... ?

50
นอกจากนี้ python -c 'sys นำเข้า; พิมพ์ sys.path 'ช่วย - บางครั้งผู้ใช้วางไฟล์ในเส้นทางที่ไม่ได้สแกน
mikebabcock

1
ฉันใช้สิ่งเดียวกันยกเว้น WinSCP .binไม่ได้ผนวก
ผู้ใช้

9
ถ้าฉันมี "__init__.py" ว่างเปล่าจะเกิดอะไรขึ้น?
dietbacon

2
OMG คุณปกครอง! นี่คือเรื่องราวของฉัน: 1. คุณแก้ไขinit .py บน windows 2. มันเพิ่ม TAB แทนช่องว่าง 3. คุณ google เยอะมากจนกว่าจะพบโพสต์นี้! ;)
GBrian

1
สำหรับผมประเด็นสำคัญคือผมใช้python driver.pyเมื่อฉันควรจะได้รับการใช้ตั้งแต่ผมติดตั้งกับpython3 driver.py pip3
Eric Wiener

72

ทำ

(local directory)/site-packages/toolkit

มี__init__.py?

ในการทำให้การนำเข้าเดินผ่านไดเรกทอรีของคุณทุกไดเรกทอรีต้องมี__init__.pyไฟล์


1
จุดดี! หมายเหตุ: ตั้งแต่ Python 3.3 ไดเรกทอรีใด ๆ บน sys.path ที่มีชื่อตรงกับชื่อแพ็คเกจจะถูกจดจำ
PatrickT

1
ไม่จำเป็นสำหรับการอ้างอิงเส้นทางแบบสัมพัทธ์เท่านั้น เหตุใดจึงต้องมีทุกไดเรกทอรี
Sonic Soul

56

ฉันพบสิ่งที่คล้ายกันมากเมื่อฉันออกกำลังกายใน LPTHW; ฉันไม่เคยได้รับ Python ที่จะรับรู้ว่าฉันมีไฟล์ในไดเรกทอรีที่ฉันโทรมา แต่ฉันสามารถทำให้มันทำงานได้ในที่สุด สิ่งที่ฉันทำและสิ่งที่ฉันแนะนำคือลองทำสิ่งนี้:

(หมายเหตุ: จากการโพสต์ครั้งแรกของคุณฉันกำลังสมมติว่าคุณกำลังใช้เครื่องที่ใช้ * NIX และกำลังเรียกใช้สิ่งต่าง ๆ จากบรรทัดคำสั่งดังนั้นคำแนะนำนี้ได้รับการปรับให้เหมาะสมตั้งแต่ฉันใช้ Ubuntu นี่คือสิ่งที่ฉันทำ)

1) เปลี่ยน directory (cd) ไปยังไดเรกทอรีด้านบนไดเรกทอรีที่ไฟล์ของคุณอยู่ ในกรณีนี้คุณกำลังพยายามเรียกใช้mountain.pyไฟล์และพยายามเรียกใช้toolkit.interface.pyโมดูลซึ่งอยู่ในไดเรกทอรีที่แยกต่างหาก ในกรณีนี้คุณจะไปที่ไดเรกทอรีที่มีพา ธ ไปยังไฟล์เหล่านั้นทั้งสอง (หรือกล่าวอีกนัยหนึ่งคือไดเร็กทอรีที่ใกล้เคียงที่สุดที่พา ธ ของไฟล์ทั้งสองแบ่งปัน) ซึ่งในกรณีนี้คือtoolkitไดเรกทอรี

2) เมื่อคุณอยู่ในtookitไดเรกทอรีใส่บรรทัดของรหัสนี้ในบรรทัดคำสั่งของคุณ:

export PYTHONPATH=.

สิ่งนี้ตั้งค่า PYTHONPATH ของคุณเป็น "." ซึ่งโดยทั่วไปหมายความว่า PYTHONPATH ของคุณจะมองหาไฟล์ใด ๆ ที่เรียกว่าภายในไดเรกทอรีที่คุณอยู่ในปัจจุบัน (และอื่น ๆ อีกมากในสาขาย่อยไดเรกทอรีของไดเรกทอรีที่คุณอยู่ ดังนั้นไม่เพียง แต่ดูในไดเรกทอรีปัจจุบันของคุณ แต่ในไดเรกทอรีทั้งหมดที่อยู่ในไดเรกทอรีปัจจุบันของคุณ)

3) หลังจากที่คุณตั้ง PYTHONPATH ของคุณในขั้นตอนข้างต้นให้เรียกใช้โมดูลของคุณจากไดเรกทอรีปัจจุบันของคุณ ( toolkitไดเรกทอรี) Python ควรค้นหาและโหลดโมดูลที่คุณระบุ

หวังว่านี่จะช่วยได้ ฉันค่อนข้างผิดหวังกับตัวเอง


2
หรือบน set PYTHONPATH=.Windows
cjbarth

สิ่งนี้ใช้ได้สำหรับฉัน นอกจากนี้ยังทำให้ความผิดหวัง PYTHONPATH ของฉันง่ายขึ้นโดยสิ้นเชิงเพราะฉันต้องอัปเดตเป็นเส้นทางที่แน่นอนทุกครั้งที่ฉันสลับเครื่อง ขอบคุณขอบคุณขอบคุณ.
the_e

41

บน * ระวังตรวจสอบให้แน่ใจว่า PYTHONPATH ได้รับการกำหนดค่าอย่างถูกต้องโดยเฉพาะอย่างยิ่งมันมีรูปแบบนี้:

 .:/usr/local/lib/python

มายด์ .:ที่จุดเริ่มต้นเพื่อให้สามารถค้นหาในไดเรกทอรีปัจจุบันได้เช่นกัน)

มันอาจจะอยู่ในสถานที่อื่นขึ้นอยู่กับรุ่น:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

6
นอกจากนี้ยังอาจจะ.:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7และอื่น ๆ ขึ้นอยู่กับรุ่น
Nikita Volkov

สำหรับฉันโมดูลอยู่ใน /usr/local/lib/python3.4/dist-packages แต่เมื่อฉันพิมพ์ python3 ในเทอร์มินัล (Ubuntu) และพยายามที่จะนำเข้ามันไม่อนุญาตให้ฉันบอกว่ามัน ไม่มีอยู่ "ImportError: ไม่มีโมดูล x อยู่"
user65165

การเพิ่ม#!/usr/bin/pythonที่ส่วนท้ายของไฟล์ควรทำงานด้วยใช่ไหม
Nearoo

1
@ ใกล้ฉันไม่คิดว่ามันจะใช้ได้ นอกจากนี้มักจะเพิ่ม Shebang นี้ที่ด้านบนของไฟล์
Renaud

2
บน MacOSX แก้ไขได้โดยเพิ่ม PYTHONPATH = / usr / local / lib / python2.7 / site-packages ลงในสคริปต์เริ่มต้น
Johan Snowgoose

23

ฉันแก้ไขปัญหาของตัวเองแล้วฉันจะเขียนบทสรุปของสิ่งที่ผิดและวิธีแก้ปัญหา:

__init__.pyไฟล์จะต้องเรียกว่า หากส่วนขยายนั้นแตกต่างกันเช่นในกรณีของฉัน.py.binPython จะไม่สามารถเคลื่อนที่ผ่านไดเรคทอรีได้และจะไม่พบโมดูล ในการแก้ไขไฟล์คุณต้องใช้โปรแกรมแก้ไข Linux เช่นviหรือnanoนาโนหากคุณใช้ตัวแก้ไข Windows สิ่งนี้จะเขียนตัวอักษรที่ซ่อนอยู่

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


ปัญหาที่ฉันได้รับคือโมดูลได้รับการติดตั้งโดย pip โดยมีเพียงผู้ใช้รูทเท่านั้นที่จะเข้าถึงดังนั้นผู้ใช้ที่รันโปรแกรมไม่เห็น
Jānis Elmeris

@ JānisElmerisคุณสามารถอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับความคิดเห็นข้างต้นได้ฉันคิดว่าฉันกำลังเผชิญกับข้อผิดพลาดที่คล้ายกัน ฉันได้ฉัน__init__.pyไฟล์อยู่ในไดเรกทอรีที่เกี่ยวข้อง setup.pyแต่ฉันด้วยตนเองติดตั้งแพคเกจการใช้ การติดตั้งแพคเกจใหม่จะรบกวนการนำเข้าอย่างไร
กฤษณะ Oza

@darth_coder ขอโทษนั่นคือเมื่อหกปีก่อนและฉันจำไม่ได้ นอกจากนี้ฉันกำลังติดต่อกับ Python น้อยมากไม่ใช่เมื่อเร็ว ๆ นี้ จากสิ่งที่ฉันเขียนฉันสามารถคิดได้ว่าฉันติดตั้งแพคเกจเป็นรูทซึ่งเปลี่ยนสิทธิ์เพื่อให้ผู้ใช้รายอื่นไม่สามารถเข้าถึงได้ก่อนหน้านี้
Jānis Elmeris

19

ทางออกที่ง่ายคือการติดตั้งโมดูลที่ใช้python -m pip install <library-name>แทนคุณpip install <library-name> อาจใช้ sudo ในกรณีที่มีข้อ จำกัด ของผู้ดูแลระบบ


2
สิ่งที่จะเกิดpython -mขึ้นต่อหน้าpip install?
sporc

1
@sporc - เมื่อคุณใช้แฟล็กบรรทัดคำสั่ง -m Python จะนำเข้าโมดูลหรือแพ็กเกจสำหรับคุณแล้วเรียกใช้เป็นสคริปต์ เมื่อคุณไม่ใช้แฟล็ก -m ไฟล์ที่คุณตั้งชื่อจะถูกเรียกใช้เป็นเพียงสคริปต์
Tony Ciccarone

ไม่แน่ใจว่าสิ่งที่คำตอบนี้พยายามที่จะพูดว่า wrt python -m pip...ทำงานได้ แต่pip...ไม่ได้: พวกเขามีประสิทธิภาพในสิ่งเดียวกันโดยสมมติว่าเป็นจริงในpythonไดเรกทอรีเดียวกัน อาจเป็นไปได้ว่าสถานการณ์ที่สังเกตได้คือpipโปรแกรมแบบสแตนด์อโลนไม่สามารถใช้งานได้ในบางรุ่นของงูหลามที่เก่ากว่า ในกรณีนั้น, pythonอยู่ใน localen virtualv และpipไม่, ดังนั้นpython -m pip installจะติดตั้งใน virtualenv โลคัล, ในขณะที่pipพยายามติดตั้งในระบบ python (และล้มเหลวโดยไม่มี w / o sudo). ไม่ว่าในกรณีใดมันก็ไม่สมเหตุสมผล
ไมเคิล

17

ในการทำเครื่องหมายไดเรกทอรีเป็นแพ็คเกจที่คุณต้องการไฟล์ชื่อ__init__.pyสิ่งนี้ช่วยได้หรือไม่?


ฉันมีไฟล์ชื่อinit .py.bin อยู่แล้วหากฉันเปลี่ยนชื่อเป็นinit .py ฉันจะได้รับข้อผิดพลาดนี้: /__init__.py ", บรรทัด 1" ยูทิลิตี้ "," สาธิต "] ^ SyntaxError: ไวยากรณ์ที่ไม่ถูกต้อง
Eduardo

มีอะไรในinit .py กรุณาโพสต์ข้อความนี้เป็นส่วนหนึ่งของคำถามของคุณ
S.Lott

ไม่มีอะไรมันว่างเปล่ามันมาพร้อมกับแพ็คเกจที่ฉันดาวน์โหลดฉันต้องเขียนบางอย่างในไฟล์หรือไม่
Eduardo

@ S.Lott: คุณไม่จำเป็นต้องใส่อะไรลงในinit .py ของคุณใช่มั้ย
igorgue

1
@Eduardo init .py ของคุณได้รับข้อผิดพลาด และคุณบอกว่ามันว่างเปล่า มันยากที่จะกระทบยอด และมันไม่สามารถเรียกได้ว่าinit .py.bin - Python จะไม่สนใจไฟล์นี้ โดยปกติแล้วจะไม่มีอะไรในนั้น
S.Lott

16

การใช้PyCharm(ส่วนหนึ่งของชุด JetBrains) คุณต้องกำหนดไดเรกทอรีสคริปต์ของคุณเป็นแหล่งที่มา:
Right Click > Mark Directory as > Sources Root


12

คุณกำลังอ่านคำตอบนี้บอกว่าคุณ__init__.pyอยู่ในสถานที่ที่ถูกต้องคุณได้ติดตั้งการอ้างอิงทั้งหมดและคุณยังคงได้รับImportErrorอยู่ในสถานที่ที่เหมาะสมคุณได้ติดตั้งการอ้างอิงทั้งหมดและคุณจะยังคงได้รับ

ฉันกำลังเผชิญกับปัญหาที่คล้ายกันยกเว้นว่าโปรแกรมของฉันจะทำงานได้ดีเมื่อวิ่งโดยใช้ PyCharm แต่ข้อผิดพลาดข้างต้นเมื่อฉันจะเรียกใช้จากสถานี หลังจากขุดเพิ่มเติมฉันพบว่าPYTHONPATHไม่มีรายการสำหรับไดเรกทอรีโครงการ ดังนั้นฉันตั้งPYTHONPATHต่อคำสั่งนำเข้าทำงานบน PyCharm แต่ไม่ได้มาจาก terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

มีวิธีอื่นในการทำสิ่งนี้โดยใช้sys.pathเป็น:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

คุณสามารถใช้การแทรก / ผนวกตามลำดับที่คุณต้องการค้นหาโครงการของคุณ


12

สำหรับฉันมันเป็นสิ่งที่โง่จริงๆ ผมติดตั้งห้องสมุดโดยใช้pip3 installแต่ถูกเรียกใช้โปรแกรมของฉันเป็นเมื่อเทียบกับpython program.pypython3 program.py


1
ว้าว ! นั่นก็ใช้ได้กับฉันด้วย
JavaDeveloper

1
คุณบันทึกวันของฉัน
Aymen

7

ได้. คุณต้องการไดเรกทอรีเพื่อเก็บ__init__.pyไฟล์ซึ่งเป็นไฟล์ที่เริ่มต้นแพ็คเกจ ที่นี่มีลักษณะที่นี้

จำเป็นต้องใช้ไฟล์ __init__.py เพื่อให้ Python ดูแลไดเรกทอรีที่มีแพ็คเกจ สิ่งนี้ถูกทำขึ้นเพื่อป้องกันไดเรกทอรีที่มีชื่อสามัญเช่นสตริงจากการซ่อนโมดูลที่ถูกต้องโดยไม่ตั้งใจซึ่งเกิดขึ้นในภายหลังบนเส้นทางการค้นหาโมดูล ในกรณีที่ง่ายที่สุด __init__.py สามารถเป็นไฟล์ที่ว่างเปล่าได้ แต่สามารถรันโค้ดการเริ่มต้นสำหรับแพ็คเกจหรือตั้งค่าตัวแปร __all__ ตามที่อธิบายไว้ในภายหลัง


6
  1. คุณต้องมีไฟล์ __ init__.py ในไดเรกทอรีเดียวกันกับที่เป็นไฟล์ที่คุณกำลังนำเข้า
  2. คุณไม่สามารถลองนำเข้าไฟล์ที่มีชื่อเดียวกันและเป็นไฟล์จาก 2 โฟลเดอร์ที่กำหนดค่าไว้ใน PYTHONPATH

เช่น: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

และถ้าคุณพยายามนำเข้าไฟล์ foo หลามจะไม่ทราบว่าคุณต้องการใช้ไฟล์ไหน

จากการนำเข้า foo ... >>> importerror: ไม่มีโมดูลชื่อ foo


5

สองเซ็นต์ของฉัน:

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

น้ำลาย:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

สิ่งนี้ทำให้ฉันสับสน - จากการโพสต์และโพสต์บอกว่าแฮ็กที่น่าเกลียด (ตามที่คุณเห็นฉัน__init__.pyอยู่ที่นั่น) กลับกลายเป็นว่าเกม / oblivion.py และเกม / การให้อภัยนั้นทำให้สับสนระหว่างงูหลามซึ่งพ่นควันออกมาค่อนข้างไม่ช่วยเหลือ "ไม่มีโมดูลชื่อกลุ่มบันทึก" ฉันจะสนใจวิธีแก้ปัญหาและ / หรือลิงก์ที่ระบุถึงพฤติกรรม (ชื่อเดียวกัน) นี้ -> EDIT (2017.01.24) - ดูสิ่งที่ถ้าฉันมีโมดูลและแพ็คเกจด้วยชื่อเดียวกัน? แพ็คเกจที่น่าสนใจตามปกติมีความสำคัญกว่า แต่เห็นได้ชัดว่าตัวเรียกใช้งานของเราละเมิดสิ่งนี้

แก้ไข (2015/01/17): ผมไม่ได้พูดถึงเราจะใช้กำหนดเองปล่อยชำแหละที่นี่


เหมือนเส้นทางถูกปิด game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py อาจต้องการแก้ไขด้วยการผนวกรหัสไพ ธ อนของคุณเพื่อใช้:game.oblivion.patchers.RecordGroups
Dwight Spencer

@DwightSpencer: ฉันแน่ใจว่าฉันนำเข้า "กลุ่มบันทึก" ในgame.oblivion.__init__.pyแต่อาจต้องตรวจสอบนี้
Mr_and_Mrs_D

4

Linux: โมดูลที่อิมพอร์ตอยู่ใน /usr/local/lib/python2.7/dist-packages

หากคุณกำลังใช้โมดูลที่คอมไพล์ใน C อย่าลืมที่จะ chmod ไฟล์sudo setup.py install. so หลังจากนั้น

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

3

ในกรณีของฉันปัญหาคือฉันกำลังเชื่อมโยงไปยังดีบั๊ก python & boost::Pythonซึ่งต้องการให้ส่วนขยายFooLib_d.pydนั้นไม่ใช่แค่FooLib.pyd; การเปลี่ยนชื่อไฟล์หรือCMakeLists.txtคุณสมบัติการอัพเดทแก้ไขข้อผิดพลาด


3

หากคุณลองใช้วิธีการทั้งหมดที่ให้ไว้ข้างต้น แต่ล้มเหลวโมดูลของคุณอาจมีชื่อเดียวกันกับโมดูลในตัว หรือโมดูลที่มีชื่อเดียวกันอยู่ในโฟลเดอร์ที่มีลำดับความสำคัญสูงsys.pathกว่าโมดูลของคุณ

ในการแก้ปัญหาของคุณบอกว่าข้อร้องเรียนfrom foo.bar import baz ImportError: No module named barเปลี่ยนเป็นimport foo; print fooซึ่งจะแสดงเส้นทางของfooซึ่งจะแสดงเส้นทางของมันเป็นสิ่งที่คุณคาดหวัง?

ถ้าไม่ว่าจะเปลี่ยนชื่อfooหรือใช้การนำเข้าแน่นอน


1
ImportError: No module named fooสำหรับผมแล้วอัตราผลตอบแทนนี้
alex

3

ปัญหาของฉันคือฉันเพิ่มไดเรกทอรีที่มี__init__.pyไฟล์ไปยัง PYTHONPATH เมื่อจริง ๆ แล้วฉันต้องการเพิ่มไดเรกทอรีหลัก


3

ถึงทุกคนที่ยังมีปัญหานี้อยู่ ฉันเชื่อว่า Pycharm สับสนกับการนำเข้า สำหรับฉันเมื่อฉันเขียน 'จากเนมสเปซนำเข้าบางสิ่งบางอย่าง' บรรทัดก่อนหน้าจะขีดเส้นใต้เป็นสีแดงแสดงว่ามีข้อผิดพลาด แต่ใช้งานได้ อย่างไรก็ตาม '' จาก. namespace นำเข้าบางสิ่ง 'ไม่ได้ถูกขีดเส้นใต้ แต่ก็ใช้งานไม่ได้เช่นกัน

ลอง

try:
    from namespace import something 
except NameError:
    from .namespace import something

1
แรกคือไวยากรณ์หลาม 2, ที่สองคือหลาม 3
Tanya Branagan

2

แก้ไขปัญหาของฉันโดยการเขียนprint (sys.path)และพบว่างูใหญ่ใช้แพ็คเกจล้าสมัยแม้จะติดตั้งใหม่ทั้งหมด การลบหลามที่สร้างขึ้นเหล่านี้ใช้แพ็คเกจที่ถูกต้องโดยอัตโนมัติ


2

ในกรณีของฉันเพราะฉันใช้ PyCharm และ PyCharm สร้าง 'venv' สำหรับทุกโครงการในโฟลเดอร์โครงการ แต่มันเป็นเพียง mini env ของ python แม้ว่าคุณจะติดตั้งไลบรารีที่คุณต้องการใน Python แต่ในโครงการที่กำหนดเองของคุณ 'venv' ก็ไม่สามารถใช้ได้ นี่คือเหตุผลที่แท้จริงของ 'ImportError: ไม่มีโมดูลชื่อ xxxxxx' เกิดขึ้นใน PyCharm เมื่อต้องการแก้ไขปัญหานี้คุณต้องเพิ่มไลบรารีลงใน env แบบกำหนดเองของโครงการโดยขั้นตอนเหล่านี้:

  • ใน PyCharm จากเมนู 'File' -> Settings
  • ในกล่องโต้ตอบการตั้งค่าโครงการ: XXXProject-> Project Interpreter
  • คลิกปุ่ม "เพิ่ม" มันจะแสดงกล่องโต้ตอบ 'แพ็คเกจที่ใช้ได้'
  • ค้นหาห้องสมุดของคุณคลิก 'ติดตั้งแพ็คเกจ'
  • จากนั้นแพ็คเกจที่คุณต้องการทั้งหมดจะถูกติดตั้งในโฟลเดอร์ project 'venv' ที่กำหนดเองของคุณ

กล่องโต้ตอบการตั้งค่า

สนุก.


0

หลังจากได้รับปัญหาเดียวกันฉันพบว่าความละเอียดของฉันคือการลบทั้งหมด pycไฟล์จากโครงการของฉันดูเหมือนว่าไฟล์แคชเหล่านี้อย่างใดก่อให้เกิดข้อผิดพลาดนี้

วิธีที่ง่ายที่สุดที่ฉันพบคือทำการนำทางไปยังโฟลเดอร์โครงการของฉันใน Windows explorer และค้นหา*.pycจากนั้นเลือกทั้งหมด ( Ctrl+ A) และลบออก ( Ctrl+X )

เป็นไปได้ฉันสามารถแก้ไขปัญหาของฉันได้โดยเพียงแค่ลบpycไฟล์ที่ระบุแต่ฉันไม่เคยลองสิ่งนี้


0

ฉันประสบปัญหาเดียวกัน: Import error. นอกจากนี้ยังติดตั้งไลบรารี่ได้อย่างถูกต้อง 100% สาเหตุของปัญหาคือติดตั้ง python (แพ็คเก็ตแอนาคอนดา) ในพีซีเวอร์ชัน 3 ของฉัน) นี่คือสาเหตุที่ไลบรารีถูกติดตั้งไม่ถูกที่ หลังจากนั้นฉันเพิ่งเปลี่ยนเป็นไพ ธ อนรุ่นที่ถูกต้องใน IDE PyCharm ของฉัน


0

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


0

ฉันมีปัญหาเดียวกัน (Python 2.7 Linux) ฉันพบวิธีแก้ไขแล้วและต้องการแชร์ ในกรณีของฉันฉันมีโครงสร้างด้านล่าง:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

ใน 'main.py' ฉันได้ลองชุดค่าผสมทั้งหมดไม่สำเร็จ:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

การแก้ปัญหานั้นง่ายกว่าที่ฉันคิดไว้มาก ฉันเปลี่ยนชื่อโฟลเดอร์ "หนังสือเล่มเล็ก" เป็น "หนังสือเล่มเล็ก" และนั่นก็คือ ตอนนี้ Python สามารถนำเข้าคำถามในชั้นเรียนได้ตามปกติโดยใช้ในรหัส 'main.py':

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

จากนี้ฉันสามารถสรุปได้ว่า Package-Names (โฟลเดอร์) เช่น 'booklet' ต้องเริ่มจากตัวพิมพ์เล็กมิฉะนั้น Python สร้างความสับสนด้วยชื่อคลาสและชื่อไฟล์

เห็นได้ชัดว่านี่ไม่ใช่ปัญหาของคุณ แต่คำตอบของ John Fouhyดีมากและเธรดนี้มีเกือบทุกสิ่งที่สามารถทำให้เกิดปัญหานี้ ดังนั้นนี่คืออีกหนึ่งสิ่งและฉันหวังว่านี่อาจช่วยคนอื่นได้


0

ในกรณีของฉันฉันได้รวมเส้นทางไปยังโฟลเดอร์ package.egg แทนที่จะเป็นแพคเกจจริงใต้ ฉันคัดลอกแพ็คเกจไปยังระดับสูงสุดแล้วและใช้งานได้


0

สิ่งนี้ใช้ได้กับฉัน: __init__.pyไฟล์ที่สร้างขึ้นภายในโฟลเดอร์หลัก (ในกรณีของคุณ, ภายในsite-packagesโฟลเดอร์) และนำเข้าเช่นนี้:

from site-packages.toolkit.interface import interface

หวังว่ามันจะมีประโยชน์สำหรับคุณเช่นกัน!


0

ลองใช้เซิร์ฟเวอร์ linux dos2unix script_name

(ลบไฟล์ทั้งหมด (ถ้ามี) pycด้วยคำสั่งfind . -name '*.pyc' -delete)

และเรียกใช้อีกครั้งในกรณีที่คุณใช้งานสคริปต์บน windows


0

ในกรณีของฉันฉันใช้sys.path.insert()เพื่อนำเข้าโมดูลท้องถิ่นและได้รับmodule not foundจากห้องสมุดอื่น ผมต้องใส่ด้านล่างการนำเข้าที่รายงานsys.path.insert() module not foundฉันเดาว่าวิธีปฏิบัติที่ดีที่สุดคือการใส่sys.path.insert()ที่ด้านล่างของการนำเข้าของคุณ

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