ข้อผิดพลาด PyCharm: 'ไม่มีโมดูล' เมื่อพยายามนำเข้าโมดูลของตัวเอง (สคริปต์หลาม)


161

ฉันเขียนโมดูล (ไฟล์my_mod.pyไฟล์ที่อยู่ในโฟลเดอร์my_module) ขณะนี้ฉันกำลังทำงานในไฟล์ที่อยู่ในโฟลเดอร์cool_script.py cur_projฉันได้เปิดโฟลเดอร์ใน PyCharm โดยใช้ไฟล์ - เปิด (และฉันถือว่าดังนั้นจึงเป็นโครงการ PyCharm)

ใน ProjectView (CMD-7) ฉันสามารถดูโครงการของฉันcur_proj(สีแดง) และอยู่ภายใต้ "ห้องสมุดภายนอก" my_moduleฉันจะดู ใน cool_script.py ฉันสามารถเขียนได้

from my_module import my_mod as mm

และ PyCharm ยังให้คำแนะนำกับ my_mod จนถึงตอนนี้ดีมาก

อย่างไรก็ตามเมื่อฉันพยายามเรียกใช้ cool_script.py PyCharm บอกฉันว่า "ไม่มีโมดูลชื่อ my_module"

ดูเหมือนว่าฉันจะแปลกเพราะ

A) ใน terminal (OS 10.10.2) ใน python ฉันสามารถนำเข้าโมดูลได้โดยไม่มีปัญหา - มีรายการที่เกี่ยวข้องใน PYTHONPATH ใน. bashrc

B) ใน PyCharm - การตั้งค่า - Project cur_proj - Project Interpreter - CogWheel ถัดจาก python interpreter - เพิ่มเติม - แสดงพา ธ สำหรับไอคอน interpreter ที่เลือกเส้นทางจาก PYTHONPATH จะปรากฏขึ้น (อย่างที่ฉันคิดว่าควร)

เหตุใดฉันจึงได้รับข้อผิดพลาดเมื่อฉันพยายามเรียกใช้ cool_script.py - ฉันหายไปอะไร

หมายเหตุ:

ภาคผนวก 2558 ถึง 25 ก.พ.

เมื่อฉันไปที่ PyCharm to Run - แก้ไขการกำหนดค่าสำหรับโครงการปัจจุบันของฉันมีสองตัวเลือกที่ถูกเลือกด้วยเครื่องหมายถูก: " เพิ่มรูทเนื้อหาไปยัง PYTHONPATH " และ " เพิ่มรูตซอร์สไปยัง PYTHONPATH " เมื่อฉันไม่ได้ทำเครื่องหมายทั้งคู่ฉันสามารถโหลดโมดูลได้

จึงทำงานได้ในขณะนี้ - แต่ทำไม ?

คำถามเพิ่มเติมโผล่ออกมา:

  • "รูทเนื้อหา" คืออะไรและ "รูทซอร์ส" คืออะไร และทำไมการเพิ่มบางสิ่งใน PYTHONPATH จึงทำให้มันแตกได้?
  • ฉันควรยกเลิกการเลือกทั้งสองตัวเลือกเหล่านี้ตลอดเวลา (ดังนั้นในค่าเริ่มต้นไม่เพียง แต่การกำหนดค่าเฉพาะโครงการ (พาเนลด้านซ้ายของกล่องโต้ตอบการกำหนดค่า Run / Debug)

2
คุณอาจจะได้พยายามแล้ว แต่เมื่อนำเข้าโมดูลจากแพคเกจอื่น ๆ from foldername.mymodule import mymethodรวมถึงแพคเกจ อีกสิ่งที่ฉันต้องทำคือการเพิ่มโฟลเดอร์_init .pyเปล่าในโฟลเดอร์ทั้งหมดที่คุณจะใช้เพื่อไปยังโมดูลของคุณดังนั้นในกรณีที่from parentfolder.childfolder.mymodule ...คุณต้องการ init ในสองโฟลเดอร์ คุณอาจจำเป็นต้องมีแพ็คเกจระดับสูงสุดsys.pathตามที่อธิบายไว้ในคำตอบ
ziddarth

4
ฉันมีปัญหาของคุณด้วย โพสต์ต่อไปนี้แก้ไขปัญหาของฉัน: stackoverflow.com/questions/21236824/…
user3155053

คุณระบุหรือไม่ว่าเพราะเหตุใดการยกเลิกการเลือกช่องทำเครื่องหมายเหล่านี้จึงใช้งานได้จริงเมื่อเทียบกับการทำเครื่องหมายในช่อง
Nithish Inpursuit Ofhappiness

สิ่งที่ได้ผลสำหรับฉันคือการไม่เลือกEnable Django Supportในการตั้งค่าLanguages & Frameworks -> Djangoใน PyCharm รุ่น Pro มันกำลังเปิดคอนโซล django ซึ่งทำให้เกิดปัญหาการนำเข้า
Eric Blum

คำตอบ:


324

Sources Rootถ้าโมดูลของคุณเองอยู่ในเส้นทางเดียวกันที่คุณจะต้องทำเครื่องหมายเส้นทางเป็น ใน explorer โครงการคลิกขวาที่ไดเรกทอรีที่คุณต้องการนำเข้า จากนั้นเลือกและเลือกMark Directory AsSources Root

ฉันหวังว่านี่จะช่วยได้.


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

2
และจำเป็นต้องเพิ่ม__init__.pyเพื่อให้ Python ปฏิบัติต่อไดเรกทอรีที่มีแพ็คเกจ: stackoverflow.com/questions/448271//
Beatriz Fonseca

คุณจะทำอย่างไรถ้าคุณไม่ได้ใช้ pycharm ฉันกำลังเจอปัญหาเดียวกัน
Boudewijn Aasman

@BeatrizFonseca ใช่ฉันทำ ฉันไม่สามารถทำงานได้ในประเสริฐ แต่ฉันติดตั้ง pycharm และลองคำตอบที่นี่และมันก็ทำงานได้อย่างสมบูรณ์แบบดังนั้นมันต้องมีบางอย่างที่เกี่ยวข้องกับการระบุไดเรกทอรีที่ถูกต้องเป็นแพ็คเกจราก
Boudewijn Aasman

@BoudewijnAasman คุณสามารถลองใช้.ก่อนชื่อแพ็คเกจเพื่อระบุว่าแพคเกจนี้เป็นชื่อท้องถิ่น
Beatriz Fonseca

38

ดังนั้นถ้าคุณไป

-> การตั้งค่า -> โครงการ: My_project -> โครงสร้างโครงการ

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


3
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่มันใช้งานได้สำหรับฉันขอบคุณ
ไมค์ - SMT

1
พบและไม่สนใจคำตอบเดียวกันหลายครั้งคราวนี้ลองแล้วใช้งานได้!
A.Ametov

29

PyCharm Community / Professional 2018.2.1

ตอนนี้ฉันมีปัญหานี้แล้วและฉันก็สามารถแก้ไขได้ด้วยวิธีที่คล้ายกันกับ @Beatriz Fonseca และ @Julie

หากคุณไปที่File-> Settings-> Project: YourProjectName-> Project Structureคุณจะมีเลย์เอาต์ไดเรกทอรีของโครงการที่คุณกำลังทำงานอยู่คุณจะต้องผ่านไดเรกทอรีของคุณและติดป้ายกำกับว่าเป็นทั้งSourceไดเรกทอรีสำหรับไฟล์ต้นฉบับทั้งหมดของคุณ หรือเป็นResourceโฟลเดอร์สำหรับไฟล์ที่นำเข้าอย่างเคร่งครัด

คุณจะต้องตรวจสอบให้แน่ใจว่าคุณวาง__init__.pyไฟล์ไว้ในไดเรกทอรีทรัพยากรของคุณหรือที่ใดก็ตามที่คุณต้องการนำเข้าและมันจะทำงานได้อย่างสมบูรณ์แบบ

ฉันหวังว่าคำตอบนี้จะช่วยใครบางคนและหวังว่า JetBrains จะแก้ไขข้อผิดพลาดที่น่ารำคาญนี้


2
คุณลักษณะนี้ไม่ได้มีไว้สำหรับPyCharm Professionalแต่คุณลักษณะนี้มีให้ในPyCharm Community edition เช่นกัน ในโครงสร้างโครงการคลิกขวาไดเรกทอรีที่มีโมดูลแล้วเลือกจากเมนูบริบทและเลือกMark Directory as Sources Root
Astitva Srivastava

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

8

สิ่งที่ฉันพยายามคือบอกแหล่งที่ตั้งของไฟล์ของฉัน

เช่น E:\git_projects\My_project\__init__.py is my location.

ฉันไปที่ไฟล์ -> การตั้งค่า -> โครงการ: My_project -> โครงสร้างโครงการและเพิ่มรูทเนื้อหาไปยังตำแหน่งที่กล่าวถึง E:\git_projects\My_project

มันใช้งานได้สำหรับฉัน


2
ระบุโฟลเดอร์ในโครงสร้างโครงการให้กับฉัน ขอบคุณ.
Microos

ขอบคุณ @Virendra Patel และ @Microos โครงการ pycharm /home/my_user/git_projects/this_git_project/this_pycharm_project/ของฉันอยู่ใน ฉันเพิ่ม/home/my_user/git_projects/this_git_project/เป็นรูทเนื้อหาและ/home/my_user/git_projects/this_git_project/this_pycharm_project/เป็นซอร์สโฟลเดอร์เดียวและทุกอย่างก็เสร็จสิ้นในที่สุด
KLaz

3

my_moduleเป็นโฟลเดอร์ที่ไม่โมดูลและคุณจะไม่สามารถนำเข้าโฟลเดอร์ลองย้ายmy_mod.pyไปยังโฟลเดอร์เดียวกันเป็นแล้วไม่cool_script.py import my_mod as mmนี่เป็นเพราะไพ ธ อนมองในไดเรกทอรีปัจจุบันsys.pathเท่านั้นและจะไม่พบmy_mod.pyจนกว่าจะอยู่ในไดเรกทอรีเดียวกัน

หรือคุณสามารถดูที่นี่คำตอบบอกวิธีการที่นำเข้าจากไดเรกทอรีอื่น ๆ

สำหรับคำถามอื่น ๆ ของคุณฉันไม่รู้ว่าไม่ใช้ PyCharm


คุณสามารถสร้างinit .py ได้ในโฟลเดอร์ตัวแปลภาษาไพ ธ อนจะอ่านเป็นแพคเกจของ python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca

3

ฉันได้รับข้อผิดพลาดด้วย "เพิ่มซอร์สของรากไปยัง PYTHONPATH" เช่นกัน ปัญหาของฉันคือการที่ฉันมีสองโฟลเดอร์ที่มีชื่อเดียวกันเช่นproject/subproject1/thing/srcและproject/subproject2/thing/srcและฉันได้ทั้งของพวกเขาทำเครื่องหมายเป็นรากที่มา เมื่อฉันเปลี่ยนชื่อ"thing"โฟลเดอร์หนึ่งเป็น"thing1"(ชื่อใด ๆ ที่ไม่ซ้ำกัน) มันทำงานได้

บางทีถ้า PyCharm เพิ่มแหล่งที่มาที่เลือกโดยอัตโนมัติ แต่ก็ไม่ได้ใช้เส้นทางแบบเต็มและดังนั้นจึงรวมโฟลเดอร์ด้วยชื่อเดียวกัน


2

สิ่งนี้อาจเกิดขึ้นเมื่อล่าม Python ไม่พบรหัสของคุณ คุณต้องพูดถึง Python อย่างชัดเจนเพื่อค้นหารหัสของคุณในตำแหน่งนี้

โดยทำดังนี้

  • ไปที่คอนโซลหลามของคุณ
  • เพิ่มsys.path.extend(['your module location'])ไปยัง Python console

ในกรณีของคุณ:

  • ไปที่คอนโซลหลามของคุณ
  • ในการเริ่มต้นเขียนรหัสต่อไปนี้:

    import sys
    sys.path.extend([my module URI location])
  • เมื่อคุณเขียนคำสั่งนี้คุณสามารถเรียกใช้คำสั่งต่อไปนี้:

    from mymodule import functions

น่าเกลียดเล็กน้อยที่จะเพิ่มเส้นทางแบบนั้น แต่มันก็ใช้ได้สำหรับฉัน
Florian Blume

สิ่งนี้ควรทำโดย pycharm โดยอัตโนมัติเมื่อเปิดคอนโซลเขาควรรวมคำสั่ง sys.path.extend สำหรับไดเรกทอรีรวมถึงการพึ่งพา (โครงการอื่น ๆ ) และไดเรกทอรีที่มีซอร์สโค้ดของโครงการปัจจุบัน แต่มันไม่ได้ทำโดยอัตโนมัติ
fabiob

2

ขั้นตอนสำคัญที่ต้องทำให้สับสนคือการสร้างการกำหนดค่าการทำงานสำหรับไฟล์ต้นฉบับที่คุณพยายามเรียกใช้อีกครั้งเพื่อให้ IDE เลือกเส้นทางใหม่

วิธีที่ใช้งานได้จริงสำหรับฉันคือไปที่เรียกใช้ / แก้ไขการกำหนดค่า ... เลือกการกำหนดค่าสำหรับไฟล์ที่คุณพยายามเรียกใช้ทางด้านซ้ายยกเลิกการเลือกช่อง "เพิ่มแหล่งรากลงใน PYTHONPATH" บันทึก จากนั้นย้อนกลับไปทำเครื่องหมายที่ช่องและบันทึก แล้วมันจะทำงาน


น่าอัศจรรย์นี่คือสิ่งที่ฉันต้องการแม้จะทำInvalidate Cache/Restartสองครั้ง!
Josh Friedlander

1

รูทเนื้อหาคือโฟลเดอร์ที่ถือรหัสโครงการของคุณในขณะที่รูทซอร์สจะถูกกำหนดเหมือนกัน ข้อแตกต่างเดียวที่ฉันเข้าใจคือรหัสในซอร์สรากถูกสร้างขึ้นก่อนโค้ดในรูทเนื้อหา

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

อัปเดต - ปัญหาเกิดขึ้นเมื่อใช้ Virtual Environmanet เท่านั้นและเมื่อควบคุมโครงการผ่านเทอร์มินัลที่ให้ไว้ ทำให้เทอร์มินัลยังคงทำงานผ่าน pyhtonpath ระบบเริ่มต้นไม่ใช่ env เสมือน ในขณะที่แผงควบคุม pango django ทำงานได้ดี


1

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

เปลี่ยนเส้นทางจาก:

เมื่อล่ามดำเนินการคำสั่งนำเข้ามันจะค้นหา x.py ในรายการของไดเรกทอรีที่รวบรวมจากแหล่งต่อไปนี้:

  1. ไดเรกทอรีที่สคริปต์ป้อนทำงานหรือไดเรกทอรีปัจจุบันหากล่ามกำลังทำงานแบบโต้ตอบ
  2. รายการไดเร็กทอรีที่มีอยู่ในตัวแปรสภาพแวดล้อม PYTHONPATH หากตั้งไว้
  3. รายการติดตั้งไดเรกทอรีที่กำหนดค่าในเวลาติดตั้ง Python ในกรณีของฉัน usr / lib / python3.6 บน Ubuntu

0

Pycharm 2017.1.1

  1. คลิกที่View->ToolBar&View->Tool Buttons
  2. บนบานหน้าต่างด้านซ้ายProjectจะมองเห็นได้คลิกขวาบนแล้วกดAutoscroll to source และเรียกใช้รหัสของคุณ

สิ่งนี้ใช้ได้สำหรับฉัน


0

ln -s someProject

หากคุณมีบางไดเรกทอรี / someProjectDir และสองไฟล์ file1.py และ file2.py และ file1.py พยายามนำเข้าด้วยบรรทัดนี้

จาก someProjectDir นำเข้าไฟล์ 2

มันจะไม่ทำงานแม้ว่าคุณจะกำหนด someProjectDir เป็นไดเรกทอรีต้นทางและแม้ว่ามันจะแสดงในการกำหนดค่าตามความชอบโครงการเมนูโครงสร้างโครงการเป็นรูทเนื้อหา วิธีเดียวที่จะใช้งานได้คือการเชื่อมโยงโครงการตามที่แสดงข้างต้น (คำสั่ง unix ทำงานใน mac ไม่แน่ใจในการใช้งานหรือไวยากรณ์สำหรับ Windows) ดูเหมือนว่ามีกลไกบางอย่างที่ Pycharm ทำสิ่งนี้โดยอัตโนมัติทั้งในการชำระเงินจากการควบคุมเวอร์ชันหรือการเพิ่มเป็นรูทบริบทเนื่องจาก Pitcharm ถูกสร้างขึ้นโดย Pycharm ในโครงการที่ขึ้นต่อกัน ดังนั้นเพียงคัดลอกเดียวกันแม้ว่าการจำลองแบบแปลก ๆ ของไดเรกทอรีเป็นที่น่ารำคาญและความจำเป็นที่น่างง นอกจากนี้ในการพึ่งพาที่สร้างขึ้นโดยอัตโนมัติมันจะไม่แสดงเป็นไดเรกทอรีใหม่ภายใต้การควบคุมเวอร์ชัน บางทีการเปรียบเทียบไฟล์. aide จะเปิดเผยมากกว่านี้


-1

คำตอบที่เหมาะกับฉันคือสิ่งที่ OP กล่าวถึงในการอัปเดตปี 2015 ของเขา: ยกเลิกการเลือกช่องทั้งสองนี้ในการตั้งค่า Python ของคุณ:

  • "เพิ่มรูทเนื้อหาไปยัง PYTHONPATH"
  • "เพิ่มแหล่งที่มาของรากไปยัง PYTHONPATH"

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

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