Python 2和3中的-m标志有何不同?

3
在Python 3中,我可以在命令行中使用-m标志运行任何目录作为Python包,或者在其中运行具有相对导入的python模块。然而,在Python 2中似乎不是这种情况。
假设我有以下文件结构:
C:\mflag
└───pack
        hey.py

And that the contents of hey.py are:

from __future__ import print_function

print("Hello!")

为什么这两个命令的行为不同呢?
C:\mflag>python -m pack.hey
Hello!

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

2
怀疑这可能与命名空间包有关。 - Benjamin Hodgson
1
我认为你应该有一个 pack\__init__.py 文件来使它成为一个正式的包。Python 3 可能会更加灵活一些。 - ShadowRanger
1个回答

6

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

在导入处理过程中,导入机制将继续像Python 3.2一样迭代父路径中的每个目录。 在寻找名为“foo”的模块或包时,对于父路径中的每个目录:

  • 如果找到了 /foo/__init__.py,则会导入并返回一个常规包。

  • 如果没有找到 /foo.{py,pyc,so,pyd},则会导入并返回一个模块。扩展名的确切列表因平台和是否指定-O标志而异。此处的列表是代表性的。

  • 如果没有找到 /foo,但找到了一个目录,则会记录该目录,并继续扫描父路径中的下一个目录。

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


1
对于 OP 明确的“为什么?”问题,这是一个非常好的回答。值得注意的是,OP 可以通过创建一个空的 pack\__init__.py 文件在 Python2 中实现他想要的行为,这将回答他隐含的“如何?”问题。 - Robᵩ
就是这样!同一份PEP中的另一个相关部分如下: “允许隐式命名空间包意味着可以完全放弃提供__init__.py文件的要求。” - zayora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接