เหตุใดการนำเข้าแบบสัมบูรณ์จึงไม่พบโมดูลของฉัน

ฉันมีโครงการ Python 2.7 ที่มีลักษณะดังนี้:

โครงการของฉัน\

- __init__.py
- __main__.py
- foo.py

ฉันต้องการใช้การนำเข้าแบบสัมบูรณ์ ตามที่กำหนดโดย PEP 8 แต่เมื่อฉันพยายามทำสิ่งนี้ใน __main__.py:

from myproject.foo import bar

ด้วย python -m myproject

ฉันเข้าใจ:

ImportError: ไม่มีโมดูลชื่อ myproject.foo

ผมทำอะไรผิดหรือเปล่า?


person Sean W.    schedule 30.09.2013    source แหล่งที่มา
comment
คุณทำอะไรเพื่อทำให้เกิดข้อยกเว้นนั้นโดยเฉพาะ python -m myproject? หากเป็นเช่นนั้น โปรดแก้ไขคำถามของคุณด้วยข้อมูลนั้น   -  person Ian Stapleton Cordasco    schedule 30.09.2013
comment
ใช่. ฉันได้แก้ไขคำถามแล้ว   -  person Sean W.    schedule 30.09.2013


คำตอบ (2)


หลังจาก Googling อีกเล็กน้อย ปรากฎ ทั้งหมด ฉันต้องทำคือเพิ่ม:

from __future__ import absolute_import

นี่เป็นการเพิ่มการพิสูจน์อักษรในอนาคตสำหรับ Python 3 โปรดทราบว่า PyDev ไม่สามารถค้นหาโมดูลด้วยวิธีนี้ ฉันจะเปิดคำถามแยกต่างหากสำหรับเรื่องนั้น

person Sean W.    schedule 30.09.2013
comment
อาจต้องการพูดถึงในคำถามของคุณว่าคุณกำลังใช้ Python 2.x (และติดแท็กด้วยเช่นกันเพื่อความเกี่ยวข้อง) - person Wayne Werner; 30.09.2013

เพื่อให้ได้ผล myproject ต้องอยู่ในเส้นทาง Python ของคุณ คุณสามารถดำเนินการดังกล่าวภายนอกได้โดยตั้งค่าตัวแปร PYTHONPATH หรือภายในโปรแกรมโดยการเพิ่มตัวแปรลงใน sys.path

(โปรดทราบว่าไม่มีแบบแผนในการใช้ชื่อขีดล่างคู่กับชื่ออื่นที่ไม่ใช่ __init__.py __main__.py ของคุณดูเหมือนเป็นชื่อที่แปลกมาก)

person Daniel Roseman    schedule 30.09.2013
comment
__main__เข้าใจโดย pythonเมื่อคุณ python -m แพ็คเกจ - person SingleNegationElimination; 30.09.2013
comment
ฉันใช้ __main__.py เพราะ Python ค้นหามัน เมื่อ python myproject กำลังทำงาน - person Sean W.; 30.09.2013
comment
เจ๋ง ด้วยเหตุผลบางอย่าง ผมไม่เคยเจอเรื่องนั้นมาก่อน - person Daniel Roseman; 30.09.2013
comment
__main__.py ยังช่วยให้คุณซิปโปรเจ็กต์ของคุณเป็น myproject.zip (หรืออะไรก็ตาม) และรัน python myproject, @DanielRoseman - person Wayne Werner; 30.09.2013
comment
@WayneWerner ขอบคุณ! ฉันไม่รู้เรื่องนี้! - person Sean W.; 30.09.2013