“ python a / b.py”和“ python -m a.b”之间的区别

时间:2019-06-17 14:50:44

标签: python

运行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时,没有错误。

两种方法的根本区别是什么?

1 个答案:

答案 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的模块。在这种情况下,它首先在工作目录中查找这样的程序包(并在该目录中找到它),然后在(默认)搜索路径中的其他任何位置。