python命令

336 阅读8分钟

调用 Python 时,可以指定下列任意选项:

python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]

最常见的用例是启动时执行脚本:

python myscript.py

接口选项

解释器接口类似于 UNIX shell,但提供了额外的调用方法:

  • 用连接到 tty 设备的标准输入调用时,会提示输入并执行命令,输入 EOF (文件结束符,UNIX 中按 Ctrl-D,Windows 中按 Ctrl-Z, Enter)时终止。
  • 用文件名参数或以标准输入文件调用时,读取,并执行该脚本文件。
  • 用目录名参数调用时,从该目录读取、执行适当名称的脚本。
  • 用 -c command 调用时,执行 command 表示的 Python 语句。command 可以包含用换行符分隔的多条语句。注意,前导空白字符在 Python 语句中非常重要!
  • 用 -m module-name 调用时,在 Python 模块路径中查找指定的模块,并将其作为脚本执行。

非交互模式下,先解析全部输入,再执行。

接口选项会终结解释器读入的选项列表,所有后续参数都在 sys.argv 里 -- 注意,首个元素,即下标为零的元素(sys.argv[0])是表示程序来源的字符串。

-c <command>

执行 command 中的 Python 代码。command 可以是一条语句,也可以是用换行符分隔的多条语句,其中,前导空白字符与普通模块代码中的作用一样。

使用此选项时,sys.argv 的首个元素为 "-c",并会把当前目录加入至 sys.path 开头(让该目录中的模块作为顶层模块导入)。

使用 command 参数会引发 审计事件 cpython.run_command 。

-m <module-name>

在 sys.path 中搜索指定模块,并以 main 模块执行其内容。

该参数是 模块名,请勿输入文件扩展名(.py)。模块名应为有效的绝对 Python 模块名,但本实现对此不作强制要求(例如,允许使用含连字符 - 的名称)。

包名称(包括命名空间包)也允许使用。使用包名称而不是普通模块名时,解释器把 .main 作为主模块执行。此行为特意被设计为与作为脚本参数传递给解释器的目录和 zip 文件的处理方式类似。

注解 此选项不适用于内置模块和以 C 编写的扩展模块,因为它们并没有对应的 Python 模块文件。 但是它仍然适用于预编译的模块,即使没有可用的初始源文件。 如果给出此选项,sys.argv 的首个元素将为模块文件的完整路径 (在定位模块文件期间,首个元素将设为 "-m")。 与 -c 选项一样,当前目录将被加入 sys.path 的开头。

-I 选项

可用来在隔离模式下运行脚本,此模式中 sys.path 既不包含当前目录也不包含用户的 site-packages 目录。 所有 PYTHON* 环境变量也会被忽略。

许多标准库模块都包含在执行时,以脚本方式调用的代码。例如 timeit 模块:

python -m timeit -s 'setup here' 'benchmarked code here' python -m timeit -h # for details 使用 module-name 参数会引发 审计事件 cpython.run_module 。

-i

从标准输入 (sys.stdin) 读取命令。标准输入为终端时,使用 -i。

使用此选项时,sys.argv 的第一个元素是 "-", 同时,把当前目录加入 sys.path 开头。

<script>

执行 script 中的 Python 代码,该参数应为(绝对或相对)文件系统路径,指向 Python 文件、包含 main.py 文件的目录,或包含 main.py 文件的 zip 文件。

给出此选项时,sys.argv 的第一个元素就是在命令行中指定的脚本名称。

如果脚本名称直接指向 Python 文件,则把该文件所在目录加入 sys.path 的开头,并且把该文件当作 main 模块来执行。

如果脚本名称指向目录或 zip 文件,则把脚本名加入 sys.path 的开头,并把该位置中的 main.py 文件当作 main 模块来执行。

-I

选项以隔离模式运行脚本,此模式中,sys.path 既不包含脚本目录,也不包含用户的 site-packages 目录,还会忽略所有 PYTHON* 环境变量。

未给出接口选项时,使用 -i,sys.argv[0] 为空字符串 (""),并把当前目录加至 sys.path 的开头。 此外,如果系统支持,还能自动启用 tab 补全和历史编辑(参见 Readline 配置)。

通用选项

  • -? -h --help 输出所有命令行选项的简介。

  • -V --version 输出 Python 版本号并退出。示例如下:

  • 输入两次 V 选项时,输出更多构建信息,例如:

其他选项

  • -b 用 str 与 bytes 或 bytearray 对比, 或对比 bytes 与 int 时,会发出警告。重复给出该选项(-bb)时会报错。

  • -B 给出此选项时,Python 不在导入源模块时写入 .pyc 文件。另请参阅 PYTHONDONTWRITEBYTECODE。

  • --check-hash-based-pycs default|always|never 控制基于哈希值的 .pyc 文件的验证行为。 参见 已缓存字节码的失效。 当设为 default 时,已选定和未选定的基于哈希值的字节码缓存文件将根据其默认语义进行验证。 当设为 always 时,所有基于哈希值的 .pyc 文件,不论是已选定还是未选定的都将根据其对应的源文件进行验证。 当设为 never 时,基于哈希值的 .pyc 文件将不会根据其对应的源文件进行验证。

基于时间戳的 .pyc 文件的语义不会受此选项影响。

  • -d 开启解析器调试输出(限专家使用,依赖于编译选项)。 另请参阅 PYTHONDEBUG。

  • -E 忽略所有 PYTHON* 环境变量,例如,已设置的 PYTHONPATH 和 PYTHONHOME。

  • -i 脚本是第一个参数,或使用 -c 时,即便 sys.stdin 不是终端,执行脚本或命令后,也会进入交互模式。不读取 PYTHONSTARTUP 文件。

本选项用于,脚本触发异常时,检查全局变量或堆栈回溯。 详见 PYTHONINSPECT。

  • -I 在隔离模式下运行 Python。 这将同时应用 -E 和 -s。 在隔离模式下 sys.path 既不包含脚本所在目录也不包含用户的 site-packages 目录。 所有 PYTHON* 环境变量也会被忽略。 还可以施加更进一步的限制以防止用户注入恶意代码。

  • -O 移除 assert 语句以及任何以 debug 的值作为条件的代码。 通过在 .pyc 扩展名之前添加 .opt-1 来扩充已编译文件 (bytecode) 的文件名 (参见 PEP 488)。 另请参阅 PYTHONOPTIMIZE。

  • -OO 在启用 -O 的同时丢弃文档字符串。 通过在 .pyc 扩展名之前添加 .opt-2 来扩展已编译文件 (bytecode) 的文件名 (参见 PEP 488)。

  • -q 即使在交互模式下也不显示版权和版本信息。

  • -R 开启哈希随机化。 此选项权 PYTHONHASHSEED 环境变量设置为 0 时起作用,因为哈希随机化是默认启用的。

在Python的早期版本中,此选项启用哈希随机化,将 str 和 bytes 的对象 hash() 的值 "加盐" 为不可预测的随机值。虽然它们在单个Python进程中保持不变,但是在重复调用的Python进程之间它们是不可预测的。

哈希随机化旨在针对由精心选择的输入引起的拒绝服务攻击提供防护,这种输入利用了构造 dict 在最坏情况下的性能即 O(n^2) 复杂度。 详情请参阅 www.ocert.org/advisories/…

PYTHONHASHSEED 允许你为哈希种子密码设置一个固定值。

  • -s 不要将 用户 site-packages 目录 添加到 sys.path。
  • -S 禁用 site 的导入及其所附带的基于站点对 sys.path 的操作。 如果 site 会在稍后被显式地导入也会禁用这些操作 (如果你希望触发它们则应调用 site.main())。
  • -u 强制 stdout 和 stderr 流不使用缓冲。 此选项对 stdin 流无影响。
  • -v 每当一个模块被初始化时打印一条信息,显示其加载位置(文件名或内置模块)。 当重复给出时 (-vv),为搜索模块时所检查的每个文件都打印一条消息。 此外还提供退出时有关模块清理的信息A。 另请参阅 PYTHONVERBOSE。
  • -W arg 警告控制。 Python 的警告机制在默认情况下会向 sys.stderr 打印警告消息。 典型的警告消息具有如下形式:

file:line: category: message 默认情况下,每个警告都对于其发生所在的每个源行都会打印一次。 此选项可控制警告打印的频繁程度。

可以给出多个 -W 选项;当某个警告能与多个选项匹配时,将执行最后一个匹配选项的操作。 无效的 -W 选项将被忽略(但是,在发出第一个警告时会打印有关无效选项的警告消息)。

警告也可以使用 PYTHONWARNINGS 环境变量以及使用 warnings 模块在 Python 程序内部进行控制。

最简单的设置是将某个特定操作无条件地应用于进程所发出所有警告 (即使是在默认情况下会忽略的那些警告):

-Wdefault # Warn once per call location -Werror # Convert to exceptions -Walways # Warn every time -Wmodule # Warn once per calling module -Wonce # Warn once per Python process -Wignore # Never warn 操作名称可以根据需要进行缩写 (例如 -Wi, -Wd, -Wa, -We),解释器将会把它们解析为适当的操作名称。

  • -x 跳过源中第一行,以允许使用非 Unix 形式的 #!cmd。 这适用于 DOS 专属的破解操作。

  • -X 保留用于各种具体实现专属的选项。