12

私は多くの同様のエラーを見てきましたが、私の特定の問題に当てはまる解決策を見つけることができません。

PYTHONPATHにあるAkismetモジュールを使用しようとしていますが、インタラクティブインタープリターを起動すると、 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
4

6 に答える 6

15

彼の質問に対するドッペルゲンガー自身の答えにもっと注意を向けたいだけです. このエラーが発生しました。状況は次のとおりです。

「strategy.py」と呼ばれるモジュールから関数/クラス X をインポートしようとしています。

残念ながら、strategy という名前の python パッケージ ディレクトリも作成しました。つまり、'strategy' という名前のディレクトリがあり、'strategy' ディレクトリに '____init___.py' という名前のファイルが少なくとも 1 つあります。

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 が指摘しているように、実際の問題は、Python インタープリターが作成したパッケージ ディレクトリを優先し、パッケージ ディレクトリで X という名前の FILE/MODULE を検索し、実際のモジュールを無視し、strategy.py関数/クラス Xを無視することです。その中にあなたが実際に探しているものがあります。

これは、Python パッケージのドキュメントを読んだ場合に期待し、望んでいることとまったく同じですが、私のように途中で考えを変えると、頭を悩ませることになるかもしれません。

于 2011-09-18T09:56:30.063 に答える
6

PYTHONPATHが正しくグローバルに設定されている場合は完全に機能します(自分でテストしただけです)。

  • ファイルパスではなく、「akismet.py」を含むディレクトリに設定する必要があります。相対パスを使用しないようにしてください。
  • 環境変数の変更をすべてのプログラムに適用するには、再起動/ログオフが必要になる場合があることに注意してください。
于 2010-02-28T17:51:48.553 に答える
4

PYTHONPATHが実際に期待どおりであるかどうかを確認します。たとえば、インタラクティブコンソールでこれを実行します。

In [1]: import sys

In [2]: print sys.path

akismet.pyは本当にそれらのフォルダの1つにありますか?

于 2010-02-28T17:53:39.197 に答える
2

パスに「akismet」ディレクトリを含むディレクトリが必要です。'akismet'ディレクトリ自体を$PYTHONPATHに追加したと思います。

あなたが書くとき:

from akismet import Akismet

akismet/Akismet.pyPythonは、検索パスのどこかでファイルを開こうとします。

Akismetこれはすべて、ファイルであり、ディレクトリであると想定していますakismet。ファイルがある場合は、akismet.pyこのファイルを含むディレクトリをにリストする必要があります$PYTHONPATH

于 2010-02-28T17:52:00.753 に答える
1

単純:

  1. akismet がインストールされていることを確認してください (システム全体または virtualenv)
  2. Python シェルに貼り付けて確認 (akismet をインポート)
  3. プロジェクトのルート ディレクトリに移動して実行します ( find . -name akismet.py ) 。
  4. その名前のファイルが見つかった場合は、名前を変更できるかどうかを確認してください
  5. 次に実行します ( find . -name akismet.pyc -print0 | xargs -0 rm -rf )

アプリケーションを実行すると、準備完了です。

于 2013-01-13T21:05:46.510 に答える
0

ipython インタープリター内でコマンドを使用すると、 ipythonがモジュールをインポートすることをいつも忘れています。run変更したモジュールは再インポートされないため、新しい変数や関数は見つかりません。これはipythonの既知の問題です。

結論:runモジュールをリロードしないため、使用しないでください。

于 2013-04-15T16:47:41.153 に答える