以下“import”语句是否等效于Python3中的“import mypack.mymod”和“from mypack import mymod”?

以下“import”语句是否等效于Python3中的“import mypack.mymod”和“from mypack import mymod”?,python,python-3.x,Python,Python 3.x,以下import语句是否等效:import mypack.mymod和在Python3中从mypack导入mymod 假设我有以下目录层次结构: . ├── main.py └── mypack ├── __init__.py ├── __pycache__ │   ├── __init__.cpython-37.pyc │   └── mymod.cpython-37.pyc └── mymod.py 在main.py中导入mymod模块时,impor

以下
import
语句是否等效:
import mypack.mymod
在Python3中从mypack导入mymod

假设我有以下目录层次结构:

.
├── main.py
└── mypack
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-37.pyc
    │   └── mymod.cpython-37.pyc
    └── mymod.py

main.py
中导入
mymod
模块时,
import mypack.mymod
from mypack import mymod
语句是否等效?我一直在尝试这两种方法,它们似乎执行完全相同的工作。

这两个语句导入相同的模块,但通过不同的标识符使其可访问。我将给出使用
os.path
模块的示例:

import os.path

# Try accessing os.path.realpath
try:
    rp = os.path.realpath(".")
except NameError:
    print("!! Cannot access os.path")
else:
    print("OK", rp)

# Try accessing path.realpath
try:
    rp = path.realpath(".")
except NameError:
    print("!! Cannot access path")
else:
    print("OK", rp)
这将产生:

OK C:\Users\ME\Documents
!! Cannot access path
将第一行中的导入更改为:

from os import path
输出切换到:

!! Cannot access os.path
OK C:\Users\ME\Documents

区别在于w.r.t包在
main.py
中的可用性。让我们采取三种可能的方式:

假设dir结构与您的相同,并且
mymod.py


案例1: 这导致

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mymod']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mypack']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'md']
bar

案例2: 这导致

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mymod']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mypack']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'md']
bar

案例3: 这导致

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mymod']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'mypack']
bar
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'md']
bar

观察:
正如您在打印
dirs
时所看到的,案例1中的模块可用作
mymod
&因此您使用
foo
作为
mymod.foo
,在案例2中作为
mypack
&因此要使用
foo
您现在必须使用
mypack.mymod.foo
,最后在案例3中作为
md
&要使用
foo
,您现在必须使用
md.foo

它们导入相同的模块,但它们以不同的名称导入到您的脚本中…!你所说的等价物是什么意思?应该可以立即观察到,它们将模块绑定到不同的名称,因此不是等价的。这是否回答了您的问题?