-m标志在Python 2和3之间有何不同?

zay*_*ora 3 python command-line

在Python 3中,我可以在命令行中使用-m标志来运行任何目录作为Python包,或者在这些目录中运行相对导入的python模块.但是,在Python 2中似乎并非如此.

假设我有以下文件结构:

C:\mflag
????pack
        hey.py
Run Code Online (Sandbox Code Playgroud)

并且hey.py的内容是:

from __future__ import print_function

print("Hello!")
Run Code Online (Sandbox Code Playgroud)

为什么这两个命令的行为不同?

C:\mflag>python -m pack.hey
Hello!

C:\mflag>python2 -m pack.hey
C:\Python27\python2.exe: No module named pack
Run Code Online (Sandbox Code Playgroud)

Bla*_*ear 6

这是一个由PEP 0420引入的命名空间包; 特别:

在导入处理期间,导入机制将继续迭代父路径中的每个目录,就像在Python 3.2中一样.在查找名为"foo"的模块或包时,对于父路径中的每个目录:

  • 如果找到/ foo/_ _ init _ _.py,则导入并返回常规包.
  • 如果没有,但找到/foo.{py,pyc,so,pyd},则导入并返回模块.扩展名的确切列表因平台而异,是否指定了-O标志.这里的清单具有代表性.
  • 如果没有,但是找到了/ foo并且是一个目录,则会记录它并继续扫描父路径中的下一个目录.

  • 否则,扫描将继续执行父路径中的下一个目录.