web-dev-qa-db-ja.com

ImportError:名前ラップをインポートできません

Ubuntu = 14.04.2 LTSでpython 2.7.6を使用しています。一部のユニットテストをモックするためにモックを使用していますが、モックをインポートするとラップのインポートに失敗します。

インポートの動作に使用するモックのバージョンが異なるのか、6つ使用するのかわからない関連する回答が見つからず、仮想環境を使用していません。

mockモジュールは、python 2.7.x: https://pypi.python.org/pypi/mock と互換性があります

mock == 1.1.3 six == 1.9.0

Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mock import Mock
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/mock/__init__.py", line 2, in <module>
    import mock.mock as _mock
  File "/usr/local/lib/python2.7/dist-packages/mock/mock.py", line 68, in <module>
    from six import wraps
ImportError: cannot import name wraps

また、運のない須藤で試してみました。

$ Sudo python -c 'from six import wraps'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name wraps
24
Michael

Mock == 1.0.1をインストールしましたが、それは何らかの理由で機能しました。 (肩をすくめる)

編集:私にとっての本当の修正は更新されたsetuptoolsであり、モックと6つを最新のものにアップグレードすることができました。私はsetuptools 3.3を使用していました。私の場合、「/ usr/local/lib/python2.7/dist-packages /」のOSが所有しているため、これらのモジュールも手動で削除する必要がありました。

すべてのバージョンを確認する

pip freeze | grep -e six -e mock
easy_install --version

すべてを更新する

wget https://bootstrap.pypa.io/ez_setup.py -O - | Sudo python
pip install mock --upgrade
pip install six --upgrade

ありがとう@lifeless

31
Michael

私は私のMacで同じ問題に遭遇しましたが、Pythonのsys.pathに両方が含まれていることに気づくことで修正できました

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/

そして

/Library/Python/2.7/site-packages/

前者は後者よりも早い。

pythonコンソールで以下を実行することにより、これが発生しているかどうかをテストできます。

import six
six.__version__

my pythonは、以前のディレクトリ(ラッパーのない)から古いsix.pyをロードしていましたが、pipは2番目のディレクトリに新しいバージョン6をインストールしていました。デフォルトで6のバージョンが付属しています。)

Six.pyとsix.pycを最初のディレクトリから移動することで修正できました(Sudoアクセスが必要です)。したがって、pythonは2番目のディレクトリで6の新しいバージョンを見つけます。 sys.pathのパスの順序も変更できると確信しています。

削除する必要がある6つの古いバージョンを見つけるには、ターミナルコンソールからこれを実行します

find /System/Library/Frameworks/Python.framework/Versions -name six.py*
19
galv

そのため、モック1.1.1以降では、バージョン1.7以上の6つの要件を定義しています。

https://github.com/testing-cabal/mock/blob/master/requirements.txt#L6

これは、pbrによってsetuptoolsメタデータに反映されます。pbrには、次のバージョンに依存するsetup_requires依存関係があります。

https://github.com/testing-cabal/mock/blob/master/setup.py#L17

そのため、いくつかの可能性があります:1)6 1.7は十分に新しい2)何らかの理由でラップがない1.9.0であると主張するdistro 6パッケージがあります3)使用中のsetuptoolsは適切に統合されませんpbrとdepsが欠落している4)ホイールメタデータは、pip/setuptoolsの組み合わせによって適切に調査されていません。

Setuptools 17.1には厳しい要件がありますが、それは最近setup.pyによって明示的に報告されただけです。これらのうちどれが当てはまるかを把握し、更新することができれば嬉しいです https://github.com/testing-cabal/mock/issues/298 setup.py/wheelsのこの静かな失敗に。

5
lifeless

Mac OSXでは、以前にインストールされた6つのバージョンが、アップグレードされたバージョンの使用をブロックしていました。以前に提案したように、インタープリターで次を実行して、これを検証しました。

import six
six.__version__

これを修正するために、ファイルを移動しました:

mv/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py 
/tmp/old_six.py

これはこのサイトの別の回答ですでに述べられていますが、より合理的な応答を提供したかったです。

3
Control Complex

元々、古い「OS所有」バージョンとpip/setuptoolsに問題がありました。 pipを手動でインストールした後、次のようにします。

wget https://bootstrap.pypa.io/get-pip.py
Sudo python get-pip.py
Sudo ln -s /usr/local/bin/pip /usr/bin/pip

そして、最新バージョンのpipmock、およびsixをインストールしても、上記の問題がまだありました。私は6つを2回インストールしました:

/usr/lib/python2.7/dist-packages/

そして

/usr/local/lib/python2.7/dist-packages/

/ usr/lib /から6つを削除した後、うまく機能しました:rm /usr/lib/python2.7/dist-packages/*six*

2
VitalyB

Six == 1.9.0のpipインストールを行い、新しいバージョンを使用しました。 mock == 1.3.0では、ラップサポートを取得するために必要な6のバージョンが適切に定義されていないようです。

1
Jordan

別の解決策は、インストールされたパッケージを指すようにPYTHONPATH環境変数を設定することです。

次のように、bash構成で環境変数を設定します。

PYTHONPATH=/Library/Python/2.7/site-packages

ターミナルでテストを実行できるようにしました(ライブラリーを削除/名前変更することなく)。

ただし、PyCharmを使用する場合、この環境変数を正しくインポートできなかったのはあまり役に立ちませんでした。 PyCharmは親変数を含むものとして表示されていましたが(インポートを示したものにリストされているものを使用)、このインポートは正しく機能していなかったようです。

PyCharm実行構成で環境変数を上記のように手動で設定すると、これが解決します。

PyCharmがPYTHONPATH変数をシステム環境変数またはその他のトリックからインポートした後に上書きするかどうかはわかりませんが、これでエラーが解決しました。

1
enderland

面白いものを見つけました!プロジェクトのルートパスに「functools.py」という名前のファイルがあり、プロジェクトの実行中に、pycharmはImportErrorを発生させます。この問題を修正するためにファイル名を変更します~~

0
user9980897

virtualenvのような仮想環境を使用していませんが、それは確かに素晴らしいユースケースです。 Pythonインストールとプロジェクトのすべての依存関係をサンドボックス化することで、global/default pythonインストールで完全にハッキングされることを回避できます。複雑さ/困難の原因は.

これは、wrapsエラーが発生したときに使用したものです。requirements.txtにはmock==2.0.0およびsix==1.10.0

cd <my_project>
virtualenv venv
source venv/bin/activate
Sudo pip install -r requirements.txt

私の意見では、これは使いやすいだけでなく、コードを実行したい人のために文書化するのも簡単です。

0
killthrush