مرکز آموزش میهن وب هاست

مرکز آموزش میهن وب هاست

رفع خطای "ImportError: Cannot Import Name" در جنگو

پرینت این مقاله پرینت این مقاله

یکی از خطاهای رایجی که توسعه‌ دهندگان جنگو با آن مواجه می‌شوند، خطای "ImportError: Cannot Import Name" است. این ارور زمانی رخ می‌دهد که مفسر پایتون قادر به وارد کردن یک نام یا ماژول خاص در کد شما نیست. در این آموزش، دلایل وقوع این خطا بررسی و راهکارهایی برای رفع آن ارائه خواهد شد.
دلایل وقوع خطا:
1. ماژول یا کلاس موردنظر در مسیر تعریف نشده است
  • بررسی کنید آیا نام ماژول یا کلاس به‌ درستی نوشته شده است یا خیر.

  • مطمئن شوید مسیرهای ایمپورت صحیح هستند یا خیر.

به‌ عنوان‌ مثال فایل models.py در پروژه جنگو که تازه ایجاد شده باشد، شامل کد زیر است:
from django.db import models
اگر به جای django.db از django استفاده گردد، با خطای زیر مواجه خواهید شد:
from django import models
ImportError: cannot import name 'models' from 'django'
2. تایپ اشتباه در نام فایل یا کلاس
اگر نام کلاس یا تابعی که می‌خواهید ایمپورت کنید اشتباه باشد، با این خطا مواجه خواهید شد.
به‌ عنوان‌ مثال فرض کنید یک مدل به‌صورت تصویر 1 دارید:
تصویر(1)
و مایلید آن را در views.py ایمپورت کرده و از کد تصویر 2 استفاده می‌کنید:
تصویر(2)
با توجه به‌ اشتباه تایپی در نوشتن کلمه example با خطای زیر مواجه خواهید شد:
ImportError: cannot import name 'exampl' from '.models' (path/to/models.py)
3. مشکلات مربوط به نصب ماژول‌ها
در چنین حالتی ماژول موردنظر نصب نشده یا در محیط مجازی (virtual environment) فعال نیست.
به‌ عنوان‌ مثال می‌خواهید از pandas استفاده نمایید اما هنوز اقدام به نصب آن نکرده‌اید.
اگر با کد زیر اقدام به ایمپورت کنید:
from pandas import DataFrame
خطای زیر نمایش داده می شود:
ModuleNotFoundError: No module named 'pandas'
4. وابستگی‌های Circular Import
اگر دو فایل یا ماژول به‌صورت متقابل یکدیگر را ایمپورت کنند، ممکن است این خطا ایجاد شود.
در چنین مواردی راه‌حل این است که ایمپورت‌ها را بهینه کنید یا از ایمپورت تنبل (lazy imports) استفاده نمایید.
به مثال ارائه شده از کد models.py و views.py در ادامه توجه کنید.
در فایل models.py مطابق تصویر 3، متد call_view از ویوی my_view در فایل views.py استفاده می‌کند.
تصویر(3)
در فایل views.py مطابق تصویر 4، ویوی my_view از مدل ExampleModel در فایل models.py استفاده می‌کند.
تصویر(4)
این وابستگی دوطرفه باعث ایجاد حلقه می‌شود و در چنین وضعیتی:
  • models.py منتظر است تا views.py بارگذاری شود.

  • views.py در انتظار است تا models.py بارگذاری گردد.

بنابراین، هنگام اجرای کد، مثلاً با اجرای سرور توسعه (python manage.py runserver)، خطای زیر رخ می‌دهد:
ImportError: cannot import name 'ExampleModel' from partially initialized module 'example.models' (most likely due to a circular import)
برای رفع این مشکل دو راهکار وجود دارد:
  1.  عدم استفاده از چنین ساختارهایی

    این راهکار همیشه توصیه می‌شود؛ چرا که در صورت ایجاد پروژه‌های بزرگ، circular import می‌تواند مشکلات جدی ایجاد کند.
  2. کاهش وابستگی‌ها

    یکی از راه‌های ساده برای این کار استفاده از واردکردن تنبل (Lazy Import) است.
    برای رفع مشکل مثال، در models.py کد به‌صورت تصویر 5 تغییر داده شده است:
تصویر(5)
در این نسخه، وارد کردن ویو my_view تنها در زمان اجرای متد call_view انجام می‌شود و از ایجاد circular impor جلوگیری می گردد.
5. مشکلات نسخه‌ پایتون یا ناسازگاری
گاهی اوقات نسخه پایتون یا کتابخانه‌های مورد استفاده با کد شما ناسازگار است. در چنین مواردی لازم است از آخرین نسخه پایتون و جنگو استفاده شده و اگر کتابخانه‌ای باعث بروز خطا گردیده حذف یا با کتابخانه دیگری جایگزین شود.
4.5/5 از 1 رای