运行python a/b.py
时,我得到:
Traceback (most recent call last):
File "a/b.py", line 10, in <module>
from . import config
ImportError: cannot import name 'config'
运行python -m a.b
时,没有错误。
两种方法的根本区别是什么?
答案 0 :(得分:0)
根本的区别是运行命令时哪个文件夹被添加到search path for modules中。在第一种情况下,它是文件夹a
。在第二种情况下,它是a
的 parent 文件夹。
您可以通过在控制台的工作目录中创建文件夹a
,并在a
脚本中b.py
内包含以下代码,来演示该机制:
import sys
print(sys.path)
该脚本只是将Python的模块搜索路径作为目录列表打印出来。
如果从包含python a/b.py
的目录运行a
,则sys.path
列表中的第一个条目将是a
(的绝对路径)。这是因为您已明确指示Python运行该特定脚本b.py
,该脚本恰好位于该目录中。因此,该目录a
首先添加到了搜索路径。
如果您运行python -m a.b
,它将在列表的第一列,即控制台的工作目录中,打印出a
的父文件夹(的绝对路径)。这是因为在这种情况下,您不会运行特定的脚本。相反,您告诉Python在名为b
的程序包中寻找名为a
的模块。在这种情况下,它首先在工作目录中查找这样的程序包(并在该目录中找到它),然后在(默认)搜索路径中的其他任何位置。