`从…import“与”import“。

我想知道是否有代码段之间的任何区别

from urllib import request 

和片段

 import urllib.request 

或者如果它们是可以互换的。 如果它们是可互换的,那么这是“标准”/“首选”语法(如果有的话)?

谢谢!

这取决于您在引用时如何访问导入。

 from urllib import request # access request directly. mine = request() import urllib.request # used as urllib.request mine = urllib.request() 

为简单起见,您还可以在导入时自行别名,或者避免掩盖内置的插件:

 from os import open as open_ # lets you use os.open without destroying the # built in open() which returns file handles. 

很多人已经解释过关于import ,所以我想尝试在实际区别的地方进行更多的解释。

首先,让我来解释一下基本的import报表是做什么的。

import X

导入模块X ,并在当前名称空间中创build对该模块的引用。 然后,您需要定义完成的模块path以从模块内部访问特定的属性或方法(例如: X.nameX.attribute

from X import *

导入模块X ,并在当前命名空间中创build对由该模块定义的所有公共对象的引用(即,没有以_开头的名称的所有内容)或您提及的任何名称。

换句话说,在你运行这个语句之后,你可以简单地使用一个普通的(非限定的)名称来引用在模块X定义的东西。 但是X本身没有定义,所以X.name不起作用。 如果name已被定义,则由新版本取代。 如果X名称改为指向其他对象,你的模块将不会注意到。

这使得模块中的所有名称都可以在本地名称空间中使用。

现在让我们来看看当我们import XY时会发生什么:

 >>> import sys >>> import os.path 

使用名称osos.path检查sys.modules

 >>> sys.modules['os'] <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> >>> sys.modules['os.path'] <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> 

使用名称osos.path检查globals()locals()命名空间字典:

  >>> globals()['os'] <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> >>> locals()['os'] <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> >>> globals()['os.path'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'os.path' >>> 

从上面的例子中,我们发现只有os被添加到本地和全局命名空间。 所以,我们应该可以使用os

  >>> os <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> >>> os.path <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>> 

…但不是path

 >>> path Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'path' is not defined >>> 

一旦从locals()命名空间中删除了os ,即使它们存在于sys.modules ,也将无法访问osos.path

 >>> del locals()['os'] >>> os Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'os' is not defined >>> os.path Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'os' is not defined >>> 

现在我们来看看。

from

 >>> import sys >>> from os import path 

使用名称osos.path检查sys.modules

 >>> sys.modules['os'] <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> >>> sys.modules['os.path'] <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> 

所以sys.modules看起来和我们使用import name

好的。 让我们来检查一下locals()globals()命名空间的字典是什么样的:

 >>> globals()['path'] <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>> locals()['path'] <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>> globals()['os'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'os' >>> 

您可以通过使用path访问,但不能通过os.path

 >>> path <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>> os.path Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'os' is not defined >>> 

让我们从locals()中删除'path':

 >>> del locals()['path'] >>> path Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'path' is not defined >>> 

最后一个使用别名的例子是:

 >>> from os import path as HELL_BOY >>> locals()['HELL_BOY'] <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>> globals()['HELL_BOY'] <module 'posixpath' from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'> >>> 

没有定义path:

 >>> globals()['path'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'path' >>> 

from使用的一个缺陷

当你从两个不同的模块导入相同的name

 >>> import sys >>> from os import stat >>> locals()['stat'] <built-in function stat> >>> >>> stat <built-in function stat> 

再次从shutil导入stat:

 >>> >>> from shutil import stat >>> locals()['stat'] <module 'stat' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'> >>> stat <module 'stat' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'> >>> 

最后的import将赢得

function上没有什么区别,但是第一种forms是优先的,就像你可以做的那样

 from urllib import request, parse, error 

在第二种forms中必须是的

 import urllib.request, urllib.parse, urllib.error 

你必须使用完全限定的名字进行引用,这是不太优雅的。

有一个区别。 在某些情况下,其中一个会起作用,另一个则不行。 这里是一个例子:假设我们有以下结构:

 foo.py mylib\ a.py b.py 

现在,我想将b.py导入到a.py. 我想导入a.py到foo。 我如何做到这一点? 两个陈述:在我写:

 import b 

foo.py我写:

 import mylib.a 

那么当试图运行foo.py时会产生一个ImportError。 解释器会抱怨a.py(import b)中的import语句,说没有模块b。 那么如何解决这个问题? 在这种情况下,更改a中的import语句以导入mylib.b将不起作用,因为a和b都在lib中。 这里的解决scheme(或至less一个解决scheme)是使用绝对导入:

 from lib import b 

来源: Python:导入一个导入模块的模块

你正在使用Python3是包中的urllib。 两种forms都是可以接受的,没有一种forms的import比另一种更受欢迎。 有时当涉及多个包目录时,您可以使用from xyza import s前者

在这个使用urllib包的特殊情况下,第二种方式import urllib.request和使用urllib.request是标准库如何统一使用它。

在Python 2.x中,至less不能import urllib2.urlopen

你必须from urllib2 import urlopen

 Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import urllib2.urlopen Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named urlopen >>> import urllib.request Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named request >>> 

我主要抱怨导入urllib.request是你仍然可以引用urllib.parse,即使它没有被导入。

 >>> import urllib3.request >>> urllib3.logging <module 'logging' from '/usr/lib/python2.7/logging/__init__.pyc'> 

也请求我在urllib3下。 Python 2.7.4 Ubuntu的