יש לי קובץ פייתון בנתיב 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.
אדגיש כמה דברים:
יש קובץ init בכל מקום, כך שפייתון אמור להכיר בתיקיות כ-packages.
כשאני מנסה להשתמש באימפורט אבסולוטי - from app import config - הוא משום מה לא מכיר ב-package בשם app. ראיתי שלאחרים לא הייתה בעיה כזו בשימוש באימפורט אבסולוטי ל-app מתוך routers, כך שאני לא מבין מה הבעיה.
כשאני משתמש באימפורט הרלטיבי, פייצ’ארם כן מצליח “להכיר” את config ומציע לי משם תכונות שאני יכול לייבא.
ניסיתי הכל. עם הקובץ לדוגמה ובלי הקובץ לדוגמה, ופשוט לא עובד. העניין הוא שזה לא רץ לי אפילו לא מקומית. התוכנית פשוט לא מצליחה לזהות את ה-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 וגם כאשר שניהם נמצאים.
כמובן שהנתיב 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 והפרויקט יוכל להיטען.