python - 使用 "run library module as a script"选项对 "-m"意味着什么?

标签 python python-3.x

我是 Python 新手(也是编程新手),虽然有据可查,但我无法理解 -m 指令的确切含义(确切地说是在创建虚拟环境时:python3 -m venv my_env

据我从文档中可以看出,它代表“将库模块作为脚本运行”:实际上我无法弄清楚这个概念以及在没有 的情况下运行命令有什么区别-m.

而且,这是 Python 3 的特性吗?

最佳答案

Python 模块只是位于 Python 可以找到它们的位置的脚本文件。与所有脚本一样,如果您知道它们在哪里,则可以直接运行它们,例如python/path/to/module.py.

正确设计的模块通常除了设置一些东西(例如你可以导入的函数和类型)之外什么都不做,但它们通常不会有任何可见的副作用。这就是为什么您可以执行 import sys 却什么也没有发生的原因。

但是,某些模块在从命令行运行时可能会提供有用的东西。示例包括 venv 以及 http.serveridlelib:所有这些都是可以从其他模块导入而没有副作用的常规模块.

但是当直接执行时,它们都做事(例如venv建立一个虚拟环境,http.server运行一个简单的HTTP服务器,idlelib 运行空闲)。这通常通过以下检查来完成:

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.

关于python - 使用 "run library module as a script"选项对 "-m"意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46319694/

相关文章:

python - 删除 pandas 列中的部分字符串

python - 通过迭代四个连续列来获取数据帧中一行中的值的平均值

python - 如何在处理请求重试时覆盖 BACKOFF_MAX

python - (稀疏)2D numpy 数组每行/列的快速非零索引

python - mysql - 修复错误 "TypeError: ' long' 对象不可迭代”

python - 让 subprocess.Popen 只等待其子进程返回,而不等待任何孙子进程返回

python - 如何获得项目的计数字典但保持它们出现的顺序?

python - 索引错误: list assignment index out of range 'xxx' ;'xxx'

python - 如何将字符串转换为日期时间?

python - 如何在 Python 3 中查找字符串中的重复项?