سؤال

لقد رأيت العديد من الأخطاء المماثلة ، لكن لا يمكنني رؤية حل ينطبق على مشكلتي الخاصة.

أحاول استخدام وحدة 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.

بسيط:

  1. تأكد من أنك قمت بتثبيت Akismet (على مستوى النظام أو VirtualEnV)
  2. تحقق من خلال لصق (استيراد akismet) في قذيفة بيثون
  3. القرص المضغوط في الدليل الجذر لمشروعك وتشغيله (تجد . -name Akismet.py)
  4. إذا وجدت ملفًا بهذا الاسم ، فتعرف على ما إذا كان يمكنك إعادة تسميته
  5. ثم اركض (تجد . -name Akismet.pyc -Print0 | XARGS -0 RM -RF)

قم الآن بتشغيل طلبك ويجب أن تكون على ما يرام.

أنا دائما أنسى ذلك Ipython يستورد الوحدات النمطية عند استخدامها run أمر داخل مترجم ipython. لن يعيد استيراد أي وحدات تقوم بتغييرها ، لذلك لن يتم العثور على أي متغيرات أو وظائف جديدة. هذا ال قضية معروفة مع Ipython.

الخلاصة: تجنب استخدام run لأنه لن يعيد تحميل وحداتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top