خطأ Python: المستورد: لا يمكن استيراد اسم Akismet
-
23-09-2019 - |
سؤال
لقد رأيت العديد من الأخطاء المماثلة ، لكن لا يمكنني رؤية حل ينطبق على مشكلتي الخاصة.
أحاول استخدام وحدة Akismet وهو على Pythonpath الخاص بي ، ثم إذا بدأت المترجم التفاعلي ، عندما أركض from akismet import Akismet
(كما يقول docstring) ، أحصل على الخطأ التالي:
from akismet import Akismet
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name Akismet
المحلول
سيعمل بشكل مثالي إذا تم تعيين Pythonpath الخاص بك بشكل صحيح وعالمي (فقط اختبرته بنفسي).
- يجب ضبط على الدليل الذي يحتوي على "Akismet.py" ، وليس مسار الملف! تأكد من عدم استخدام المسارات النسبية.
- لاحظ أنك قد تحتاج إلى إعادة تشغيل/تسجيل الدخول لتطبيق تغييرات متغيرة للبيئة على جميع البرامج.
نصائح أخرى
أريد فقط أن ألقوا المزيد من الاهتمام إلى إجابة Doppelganger الخاصة على سؤاله. كان لدي هذا الخطأ ، والوضع هو:
أنت تحاول استيراد الوظيفة/الفئة X من وحدة نمطية تسمى "strategy.py".
لسوء الحظ ، قمت أيضًا بإنشاء دليل حزمة Python يسمى الإستراتيجية ، وبعبارة أخرى ، لديك دليل يسمى "الاستراتيجية" ، مع وجود ملف واحد على الأقل في الإستراتيجية "يسمى" ____Init___.py ".
root folder\
strategy.py (contains function/class called X)
strategy\
__init__.py
ثم تنسى حقيقة أنك قمت بإنشاء دليل حزمة Python ، ومحاولة استيراد بعض الفصول أو الوظيفة المحددة في الملف strategy.py
في دليل "الجذر" ، مثل ذلك
from strategy import X
ما تحصل عليه هو Python error: ImportError: cannot import name X
خطأ.
المشكلة الفعلية ، كما يلاحظ Doppelganger ، هي أن Bython Tropertor يعطي الأسبقية إلى دليل الحزمة الذي قمت بإنشائه ، وبحث عن ملف/وحدة يسمى X في دليل الحزمة ، ويتجاهل الوحدة الفعلية strategy.py
, ، والوظيفة/الفئة العاشر فيها التي تبحث عنها بالفعل.
هذا هو بالضبط ما تتوقعه وتريده إذا قرأت الوثائق على حزم Python ، ولكن إذا غيرت عقلك في منتصف الطريق كما فعلت ، فقد ينتهي بك الأمر إلى خدش رأسك.
تحقق مما إذا كان Pythonpath الخاص بك هو حقًا ما تتوقعه ، على سبيل المثال عن طريق القيام بذلك في وحدة تحكم تفاعلية:
In [1]: import sys
In [2]: print sys.path
هل akismet.py حقا في واحدة من هذه المجلدات؟
يجب أن يكون لديك الدليل الذي يحتوي على دليل "Akismet" في طريقك. أعتقد أنك أضفت دليل "Akismet" نفسه إلى $ pythonpath.
عندما تكتب:
from akismet import Akismet
يحاول بيثون فتح الملف akismet/Akismet.py
في مكان ما في مسار البحث.
كل هذا يفترض Akismet
هو ملف و akismet
انه دليل. إذا كان هناك akismet.py
ملف ، ثم يجب سرد الدليل الذي يحتوي على هذا الملف في $PYTHONPATH
.
بسيط:
- تأكد من أنك قمت بتثبيت Akismet (على مستوى النظام أو VirtualEnV)
- تحقق من خلال لصق (استيراد akismet) في قذيفة بيثون
- القرص المضغوط في الدليل الجذر لمشروعك وتشغيله (تجد . -name Akismet.py)
- إذا وجدت ملفًا بهذا الاسم ، فتعرف على ما إذا كان يمكنك إعادة تسميته
- ثم اركض (تجد . -name Akismet.pyc -Print0 | XARGS -0 RM -RF)
قم الآن بتشغيل طلبك ويجب أن تكون على ما يرام.
أنا دائما أنسى ذلك Ipython يستورد الوحدات النمطية عند استخدامها run
أمر داخل مترجم ipython. لن يعيد استيراد أي وحدات تقوم بتغييرها ، لذلك لن يتم العثور على أي متغيرات أو وظائف جديدة. هذا ال قضية معروفة مع Ipython.
الخلاصة: تجنب استخدام run
لأنه لن يعيد تحميل وحداتك.