Python 了解导入X和从X.Y导入Z之间的差异

Python 了解导入X和从X.Y导入Z之间的差异,python,Python,这是一个非常基本的问题,由@Mark Roddy撰写,答案非常广泛 根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效 这样做: import module 或 应该有用 我的问题: 考虑这个例子: import distutils print (distutils.util.strtobool('true')) 其中: > Traceback (most recent call last): File "<stdin>", line 1, in > &

这是一个非常基本的问题,由@Mark Roddy撰写,答案非常广泛

根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效

这样做:

import module

应该有用

我的问题:

考虑这个例子:

import distutils
print (distutils.util.strtobool('true'))
其中:

> Traceback (most recent call last):   File "<stdin>", line 1, in
> <module> AttributeError: module 'distutils' has no attribute 'util'
它给出了以下输出:

1

所以我很困惑。两者都应该起作用。为什么Python会为第一种方法生成异常?

如果
导入A
,然后尝试访问
A.B
,那么
B
必须是模块
A
中存在的有效属性。例如:

# A.py
from . import B
# or
B = 'foo'
如果
A
包含上述代码,则在
A
中,
B
是一个有效的本地名称,扩展为模块
A
的一个可访问属性。但是,如果模块
A
未定义任何
B
,则在导入A时无法访问该模块


现在,
import A.B
from A.B import…
明确地查看的不是模块的属性,而是文件和文件夹。因此,即使在
A.py
内部没有定义符号
B
,只要存在文件
B.py
或文件夹
B
import
将导入它。

如果
导入A
,然后尝试访问
A.B
,则
B
必须是模块
A
中存在的有效属性。例如:

# A.py
from . import B
# or
B = 'foo'
如果
A
包含上述代码,则在
A
中,
B
是一个有效的本地名称,扩展为模块
A
的一个可访问属性。但是,如果模块
A
未定义任何
B
,则在导入A时无法访问该模块

现在,
import A.B
from A.B import…
明确地查看的不是模块的属性,而是文件和文件夹。因此,即使在
A.py
内部没有定义符号
B
,只要有文件
B.py
或文件夹
B
import
将导入它。

这些都是等效的:

from mod import val
val

import mod
mod.val
以下是:

from mod1.mod2 import val
val

import mod1.mod2
mod1.mod2.val
但这不起作用,因为未导入
mod2

import mod1
mod1.mod2.val
如果在
mod1.py
中添加
import mod2
(或
mod1/\uuu init\uuuuuuuuuuuuuuuupy
),则
mod2
将成为
mod1
导出的值,最后一个示例将起作用
distutils
不导入
distutils.util
,因此您必须自己导入它才能访问其导出的成员。

这些是等效的:

from mod import val
val

import mod
mod.val
以下是:

from mod1.mod2 import val
val

import mod1.mod2
mod1.mod2.val
但这不起作用,因为未导入
mod2

import mod1
mod1.mod2.val

如果在
mod1.py
中添加
import mod2
(或
mod1/\uuu init\uuuuuuuuuuuuuuuupy
),则
mod2
将成为
mod1
导出的值,最后一个示例将起作用
distutils
不导入
distutils.util
,因此您必须自己导入它才能访问其导出的成员。

尝试使用
import distutils.util
然后
打印(distutils.util.strobool)
?@barny这不是一个需要解决的代码。请注意,您所建议的是我所做的,返回1-没关系。我在问为什么第一个问题会引发异常,因为在这一点上,您还没有使用
import distutils.util
导入distutils.utiltry,然后
print(distutils.util.strtobool)
?@barny这不是要解决的代码。请注意,您所建议的是我所做的,返回1-没关系。我在问为什么第一个会引发异常,因为此时您还没有导入distutils.utilThanks!我认为这也应该被添加到裁判问题中。这是丢失的重要信息,谢谢!我认为这也应该被添加到裁判问题中。这是一个重要的信息,但却没有