如果文件名为email.py或logging.py,则无法使用Python Requests模块?

wis*_*cky 1 python python-requests

我有一个简单的测试脚本:

import requests
response = requests.get('http://httpbin.org/get')
print response.text
Run Code Online (Sandbox Code Playgroud)

它的工作原理python脚本被命名时,test.py但如果命名失败email.pylogging.py:

Traceback (most recent call last):
  File "./email.py", line 3, in <module>
    import requests
  File "/usr/lib/python2.7/dist-packages/requests/__init__.py", line 53, in <module>
    from urllib3.contrib import pyopenssl
  File "/usr/lib/python2.7/dist-packages/urllib3/__init__.py", line 16, in <module>
    from .connectionpool import (
  File "/usr/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 59, in <module>
    from .request import RequestMethods
  File "/usr/lib/python2.7/dist-packages/urllib3/request.py", line 12, in <module>
    from .filepost import encode_multipart_formdata
  File "/usr/lib/python2.7/dist-packages/urllib3/filepost.py", line 15, in <module>
    from .fields import RequestField
  File "/usr/lib/python2.7/dist-packages/urllib3/fields.py", line 7, in <module>
    import email.utils
  File "/home/ubuntu/temp/email.py", line 4, in <module>
    response = requests.get('http://httpbin.org/get')
AttributeError: 'module' object has no attribute 'get'
Run Code Online (Sandbox Code Playgroud)

它似乎是requests导入urllib3,它导入email内置模块.为什么Python没有先找到内置email模块,而不是查看当前路径email.py

有没有办法使这项工作,或者我只需要总是避免命名我的Python脚本任何可能由任何依赖项导入的内置模块?

rob*_*x44 5

首先,正如您在评论中指出的那样,Python会检查该名称的"内置"模块.并非标准库中的所有模块都是"内置"的.您可以通过以下方式查看列表:

print sys.builtin_module_names
Run Code Online (Sandbox Code Playgroud)

如果在那里找不到,那么搜索的订单将由Burhan接受的答案概述:

Python中import语句的范围是什么

Python按以下顺序搜索可导入的内容:

  • 从执行脚本的目录.
  • 从PYTHONPATH环境变量中的目录(如果已设置).
  • 从系统范围的Python安装的模块目录.

在您的情况下,电子邮件不是内置的,因此首先检查当前目录.

所以,是的,不要影响python库名称.从技术上讲,你可以隐藏内置模块的名称,但请 - 请不要.它让Python哭了.