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

时间:2016-04-08 14:28:41

标签: python command-line

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

我们说我有以下文件结构:

from __future__ import print_function

print("Hello!")

hey.py的内容是:

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

C:\mflag>python2 -m pack.hey
C:\Python27\python2.exe: No module named pack

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

{{1}}

1 个答案:

答案 0 :(得分:6)

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

  

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

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

  •   
  • 否则,扫描将继续显示父路径中的下一个目录。

  •