Python “这对”意味着什么;以脚本形式运行库模块";用",-m";选项
我不熟悉Python(也不熟悉编程),尽管有很好的文档记录,但我无法理解-m指令的确切含义(正是在创建虚拟环境时:Python “这对”意味着什么;以脚本形式运行库模块";用",-m";选项,python,python-3.x,Python,Python 3.x,我不熟悉Python(也不熟悉编程),尽管有很好的文档记录,但我无法理解-m指令的确切含义(正是在创建虚拟环境时:python3-m venv my_env) 从文档中可以看出,它代表“以脚本形式运行库模块”:事实上,我无法理解这个概念,以及在没有-m的情况下运行命令的区别 此外,这是python3的一个特征吗?这不是python3的属性。在模块化脚本的情况下,您需要使用-m。例如,您有这样的文件夹结构 |-HelloModule |_ __init__.py |_ hellomodul
python3-m venv my_env
)
从文档中可以看出,它代表“以脚本形式运行库模块”:事实上,我无法理解这个概念,以及在没有-m
的情况下运行命令的区别
此外,这是python3的一个特征吗?这不是python3的属性。在模块化脚本的情况下,您需要使用-m。例如,您有这样的文件夹结构
|-HelloModule
|_ __init__.py
|_ hellomodule.py
|_ first_script.py
现在,如果要将first_script.py的任何类、函数或任何对象使用到hellomodule.py中,则必须将hellomodule.py作为模块运行,这意味着命令将更改为
python-m HelloModule/HelloModule
您必须从HelloModule目录外部运行此命令。Python模块只是位于Python可以找到它们的地方的脚本文件。与所有脚本一样,如果您知道它们在哪里,您可以直接运行它们,例如
Python/path/to/module.py
正确设计的模块通常只做设置工作(例如,可以导入的函数和类型),但它们通常不会产生任何可见的副作用。这就是为什么您可以执行导入系统的操作,但什么都不会发生
但是,某些模块在从命令行运行时可能会提供有用的内容。例如venv
,但也包括http.server
或idlelib
:所有这些都是常规模块,可以从其他模块导入,而不会产生副作用
但是,当直接执行时,它们都会做一些事情(例如,venv
设置虚拟环境,http.server
运行简单的http服务器,并且idleib
空闲运行)。通常通过以下检查来完成:
if __name__ == '__main__':
print('Module is being executed directly, so do stuff here')
这是一种特殊的方法,可以识别脚本/模块是否正在直接执行,或者是否只是从其他模块导入。您可以了解有关该问题的更多信息
因此,您可以直接使用前面建立的python/path/to/module.py
运行模块。但这需要您知道模块的完整路径。这就是-m
选项发挥作用的地方:对于通常仅使用导入modulename
即可导入的模块,您可以使用python-m modulename
直接运行该模块。就像键入了该模块的完整路径一样
因此,对于上面的示例,我们可以使用
python-m venv
,python-m http.server
。或者python-m idlelib
,文档是您的朋友:您已经阅读了?只是问一下,因为您说它有很好的文档,但没有链接到“文档”另一个很酷的示例是json.tool
用于从shell进行漂亮的打印。echo'{“1”:“a”,“2”:“b”}“| python-m json.tool
对于我来说,如果我们接受-m标志所做的唯一事情就是上面的答案中指定的,那么这看起来有点错误。导入函数与脚本无关,就好像它是从根目录运行一样。