是否使用-m选项执行Python代码
使用-m
标志。
当您拥有脚本时,结果几乎是相同的,但是当您开发一个没有-m
标志的软件包时,如果您想运行软件包中的子软件包或模块作为主条目,则无法使导入正常工作指向您的程序(相信我,我已经尝试过了。)
该文档
就像-m标志上的文档说的那样:
在sys.path中搜索指定的模块,并作为__main__
模块执行其内容。
和
与-c选项一样,当前目录将添加到sys.path的开头。
所以
python -m pdb
大致相当于
python /usr/lib/python3.5/pdb.py
(假设您在当前目录中没有名为pdb.py的软件包或脚本)
说明:
使行为“故意类似于”脚本。
许多标准库模块包含在执行时作为脚本调用的代码。一个例子是timeit模块:
某些python代码旨在作为模块运行:(我认为此示例比命令行选项doc示例更好)
$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop
并且从发行说明中突出显示了Python 2.4:
-m命令行选项-python -m modulename将在标准库中找到一个模块,然后调用它。例如,python -m pdb
相当于python /usr/lib/python2.4/pdb.py
后续问题
同样,David Beazley的Python Essential Reference将其解释为“ -m选项将库模块作为脚本运行,该脚本__main__
在执行主脚本之前在模块内部执行”。
这意味着您可以使用import语句查找的任何模块都可以作为程序的入口点运行-如果该模块具有代码块(通常在结尾处使用)if __name__ == '__main__':
。
-m
而不将当前目录添加到路径:
其他地方的评论说:
-m选项还将当前目录添加到sys.path中,显然是一个安全问题(请参阅:预加载攻击)。此行为类似于Windows中的库搜索顺序(之前已对其进行了强化)。很遗憾,Python没有遵循这种趋势,并且没有提供禁用添加的简单方法。到sys.path
好吧,这演示了可能的问题-(在Windows中删除引号):
echo "import sys; print(sys.version)" > pdb.py
python -m pdb
3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
使用该-I
标志可将其锁定在生产环境中(版本3.4中的新增功能):
python -Im pdb
usage: pdb.py [-c command] ... pyfile [arg] ...
etc...
从文档:
-I
在隔离模式下运行Python。这也意味着-E和-s。在隔离模式下,sys.path既不包含脚本的目录也不包含用户的site-packages目录。所有PYTHON *环境变量也将被忽略。可能会施加进一步的限制,以防止用户注入恶意代码。
怎么__package__
办?
它启用了显式相对导入,但与该问题并不特别相关-请在此处查看此答案:Python中“ __package__”属性的目的是什么?
PYTHONPATH=test python -m foo.bar
意思?您能详细解释一下吗?