בעיה בזיהוי import רלטיבי ואבסולוטי

יש לי קובץ פייתון בנתיב calendar/app/routers/event_images.py
וקובץ קונפיגורציה בנתיב calendar/app/config.py.
אני רוצה לעשות אימפורט רלטיבי לקובץ הקונפיגורציה ב-
event_images.py
ע"י השורה from … import config.
אבל משום מה אני מקבל את השגיאה הבאה:
ImportError: attempted relative import with no known parent package.

אדגיש כמה דברים:

  1. יש קובץ init בכל מקום, כך שפייתון אמור להכיר בתיקיות כ-packages.
  2. כשאני מנסה להשתמש באימפורט אבסולוטי - from app import config - הוא משום מה לא מכיר ב-package בשם app. ראיתי שלאחרים לא הייתה בעיה כזו בשימוש באימפורט אבסולוטי ל-app מתוך routers, כך שאני לא מבין מה הבעיה.
  3. כשאני משתמש באימפורט הרלטיבי, פייצ’ארם כן מצליח “להכיר” את config ומציע לי משם תכונות שאני יכול לייבא.
  4. כשעשיתי push לגיטהאב קיבלתי את השגיאה המצורפת:

    לא ברור למה דווקא מתריע שלא מזהה את התכונה, אבל אפשר לראות שפירש את הפקודה של האימפורט הרליטיבי כ-app.config, שזה באמת נכון.

בכל מקרה, הקוד שלי עם ההערה מופיע כאן:

היי,

הקונפיגורציה שלנו נמצאת ב־config.py.example.
כשהמערכת עוברת ב־CI, היא למעשה דורסת את config.py (שלא אמור להיות קיים ב־git) בעזרת הפקודה:

cp config.py.example config.py

על מנת שההגדרה שהוספת תזוהה, אתה צריך להוסיף אותה ב־config.py.example ולמחוק את הקובץ config.py.

ניסיתי הכל. עם הקובץ לדוגמה ובלי הקובץ לדוגמה, ופשוט לא עובד. העניין הוא שזה לא רץ לי אפילו לא מקומית. התוכנית פשוט לא מצליחה לזהות את ה-package בשם “app” מתוך routers. אני לא מצליח להבין למה, אבל אני לא חושב שזה קשור לקובץ config עצמו.
הזיהוי מצליח רק אם עולים לרמה “מעל” app בעץ התיקיות. ולא הייתה בעיה בייבוא של app מתוך הטסט בתיקיית tests משום מה. רק מתוך routers…
חקרתי המון באינטרנט וראיתי שעוד מפתחים נתקלו בבעיה דומה בלי תשובה משביעת רצון לפיתרון…
אני באמת לא יודע אם אני מפספס משהו קטן או שיש כאן אכן אישיו.

תוכל לפרט בדיוק, צעד אחר צעד, מה אתה עושה כדי להריץ?

ראשית, עץ התיקיות שלי נראה כך:

בקוד שנמצא ב-event_images.py אני מעוניין להשתמש במשתנה שהגדרתי בקובץ הקונפיגורציה שנמצא רמה אחת מעל - בתיקיית app.
לצורך כך אני כותב ב-event_images.py את הפקודה from app import config.
כשאני מריץ את הקובץ event_images.py דרך הפייצ’ארם או דרך ה-cmd אני מקבל את ההודעה:
Traceback (most recent call last):
File “event_images.py”, line 1, in
from app import config
ModuleNotFoundError: No module named ‘app’

לחלופין, אני מנסה להשתמש באימפורט רלטיבי וכותב במקום הפקודה דלעיל את הפקודה:
from … import config

כשאני מריץ את הקובץ event_images.py דרך הפייצ’ארם או דרך ה-cmd אני מקבל את ההודעה:
Traceback (most recent call last):
File “event_images.py”, line 1, in
from … import config
ImportError: attempted relative import with no known parent package

ניסיתי פעולות אלה גם כאשר הקובץ הוא config.py.example וגם כאשר הקובץ הוא config.py וגם כאשר שניהם נמצאים.

לייק 1

איך אתה מנסה להריץ אותו דרך ה¯cmd? לאיזו תיקייה אתה עושה CD ואיזו פקודה אתה מריץ?

היי ניר,
אולי, רק אולי הבעיה בפקודה אותה אתה מפעיל כדי להריץ?
האם לפני ההרצה אתה רושם cd calendar?
האם אתה משתמש בפקודה: uvicorn app.main:app?

אני לא מריץ את ה-main, אלא רק את הקובץ שאני הכנתי ואת הטסטים המתאימים לו.
אני רושם את הפקודות הבאות:

כמובן שהנתיב C:\Users\nir\Desktop\week16\clone_21012021\ הוא הנתיב שאליו עשיתי את ה-clone.
שוב אני מדגיש, שללא השימוש בשורה from app import config (וכתוצאה מכך, גם בקובץ ה-config) הקוד רץ ללא בעיות.

אי אפשר להריץ כך את הקוד. הוא תלוי בהרבה דברים אחרים.
כשאתה עושה דבר כזה הוא מניח שתיקיית הפרויקט שלך היא routers, וכל עוד אין בה app.py ה־import של app לא יעבוד.

זה אולי יעבוד אם תעשה cd ל־clone_21012021 ותקליד שם python app/routers/event_images.py.
במקרה הזה הוא אמור להניח ש־clone_21012021 הוא ה־current working directory, התיקייה תוכנס ל־PYTHONPATH והפרויקט יוכל להיטען.