2016-03-27 28 views
24

要求パッケージをインポートするrequests.pyというスクリプトがあります。スクリプトはパッケージの属性にアクセスできないか、パッケージをインポートできません。なぜこれは動作しないのですか?どうすれば修正できますか?スクリプトからインストールされたパッケージをインポートすると「AttributeError:モジュールに属性がありません」または「ImportError:名前をインポートできません」

次のコードは、AttributeErrorを発生させます。

import requests 

res = requests.get('http://www.google.ca') 
print(res) 
Traceback (most recent call last): 
    File "/Users/me/dev/rough/requests.py", line 1, in <module> 
    import requests 
    File "/Users/me/dev/rough/requests.py", line 3, in <module> 
    requests.get('http://www.google.ca') 
AttributeError: module 'requests' has no attribute 'get' 

次のコードはImportErrorを上昇させます。

from requests import get 

res = get('http://www.google.ca') 
print(res) 
Traceback (most recent call last): 
    File "requests.py", line 1, in <module> 
    from requests import get 
    File "/Users/me/dev/rough/requests.py", line 1, in <module> 
    from requests import get 
ImportError: cannot import name 'get' 

The following codeImportErrorを発生させます。

from requests.auth import AuthBase 

class PizzaAuth(AuthBase): 
    """Attaches HTTP Pizza Authentication to the given Request object.""" 
    def __init__(self, username): 
     # setup any auth-related data here 
     self.username = username 

    def __call__(self, r): 
     # modify and return the request 
     r.headers['X-Pizza'] = self.username 
     return r 
Traceback (most recent call last): 
    File "requests.py", line 1, in <module> 
    from requests.auth import AuthBase 
    File "/Users/me/dev/rough/requests.py", line 1, in <module> 
    from requests.auth import AuthBase 
ImportError: No module named 'requests.auth'; 'requests' is not a package 
+18

これは一般的な質問に対する標準的な回答を意図しています...他の質問にもっと良い、より完全な回答があることを確認しない限り、重複しないでください。 – Ffisegydd

答えて

29

お近くのモジュールが使用しようとしているインストールrequestsモジュールrequests.py影を命名ためです。現在のディレクトリはsys.pathの先頭にあるため、ローカル名がインストールされた名前よりも優先されます。

お知らせあなたが使用した名前:

これが立ち上がっ追加のデバッグのヒントは慎重にトレースバックを見て、問題のスクリプトの名前がインポートしようとしているモジュールに一致していることを実現することですスクリプト:

File "/Users/me/dev/rough/requests.py", line 1, in <module> 

モジュールインポートしようとしている:requests

は、名前の衝突を避けるために、何か他のものにあなたのモジュールの名前を変更します。

Pythonは、requests.pyファイル(Python 3の__pycache__ディレクトリ)の隣にrequests.pycというファイルを生成することがあります。あなたの名前を変更した後でも、それを削除してください。通訳者は引き続きそのファイルを参照し、エラーを再現します。ただし、 にあるpycファイルは、pyファイルが削除された場合、コードに影響しません。

この例では、ファイル名をmy_requests.pyに変更し、requests.pycを削除して再度実行すると、<Response [200]>が印刷されます。

関連する問題