在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}}
答案 0 :(得分:6)
这是一个由PEP 0420引入的命名空间包;具体是:
在导入处理期间,导入机器将继续 迭代父路径中的每个目录,就像在Python中一样 3.2。在为父路径中的每个目录查找名为" foo"的模块或包时:
- 如果找到/ foo / _ _ init _ _.py,则导入常规包 并返回。
- 如果没有,但找到/foo.{py,pyc,so,pyd},a 导入并返回模块。确切的扩展名单因人而异 平台以及是否指定了-O标志。这里的清单是 代表。
如果没有,但是/ foo被找到并且是 目录,它被记录,扫描继续下一个 父路径中的目录。
否则,扫描将继续显示父路径中的下一个目录。