我是Python的新手(也是编程人员),虽然有很好的文档,但我无法理解-m指令的确切含义(正是在创建虚拟环境时:python3 -m venv my_env
。
据我可以从文档中读到,它代表“将库模块作为脚本运行”:实际上这个概念我无法弄清楚,如果没有{{1}运行命令有什么不同}}
而且,这是Python 3的一个特点吗?
答案 0 :(得分:37)
Python模块只是位于Python可以找到它们的地方的脚本文件。与所有脚本一样,如果您知道它们的位置,可以直接运行它们,例如python /path/to/module.py
。
正确设计的模块除了设置内容(例如您可以导入的函数和类型)外通常什么也不做,但它们通常不会有任何可见的副作用。这就是为什么你可以做import sys
而没有任何反应。
但是,某些模块在从命令行运行时可能会提供有用的东西。其中的示例包括venv
以及http.server
或idlelib
:所有这些都是常规模块,可以从其他模块导入而无副作用。
但直接执行时,他们都会做一些事情(例如venv
设置虚拟环境,http.server
运行简单的HTTP服务器,idlelib
运行IDLE)。这通常通过以下检查完成:
if __name__ == '__main__':
print('Module is being executed directly, so do stuff here')
这是一种识别正在直接执行的脚本/模块的特殊方式,或者它是否只是从其他模块导入。您可以详细了解问题“What does if __name__ == '__main__':
do?”。
因此,您可以使用我们之前建立的python /path/to/module.py
直接运行模块。但这需要您了解模块的完整路径。这就是-m
选项发挥作用的地方:对于通常只能使用import modulename
导入的模块,您可以使用python -m modulename
直接运行该模块。就像你输入了它的完整路径一样。
因此,对于上面的示例,我们可以使用python -m venv
,python -m http.server
。或python -m idlelib
。
答案 1 :(得分:0)
这不是python3的属性。在模块化脚本的情况下,您需要使用-m。比如你有像这样的文件夹结构
<asp:Label runat="server" CssClass="<%# LabelCssClass %> myclass" Text="Number" AssociatedControlID="txtNumber" />
现在,如果您正在使用任何类或函数或first_script.py的任何对象到hellomodule.py,那么您必须运行hellomodule.py作为模块意味着命令将更改为
|-HelloModule |_ __init__.py |_ hellomodule.py |_ first_script.py
,您必须从HelloModule目录的外部运行此命令。