本周关注 Python 的命令行参数与环境变量,大体是在翻译文档。版本为 Python 3.7.0
Python Command line and environment
Command line
Interface options
-
-c <command>执行 command 中的 Python 代码,command 可以是一个或者多个由换行符分隔的语句,与正常代码一样前导空白符是具有意义的。指定此参数后,sys.argv的第一个元素将是-c,并且当前目录会被添加至sys.path的开头 -
-m <module-name>从sys.path中搜索指定名称的模块,然后作为__main__执行。因为参数是模块的名称,所以不需要提供文件扩展名.py。模块的名称应当是合法的 Python 模块名称,但是实际的实现并没有强制这一点,比如它可以运行使用包含连字符-的名称。参数也可以是包名,这时解释器会去执行<pkg>.__main__。指定此参数后,sys.argv的第一个元素将是模块文件的路径,并且当前目录将会被添加至sys.path的开头 -
-从标准输入(sys.stdin)读取 command,如果标准输入是 terminal,则隐含-i参数。指定此参数后,sys.argv的第一个元素为"-",并且当前目录将会被添加到sys.path的开头 -
<script>可以为一个 Python 脚本的路径,包含此文件的目录将会被添加到sys.path的开头;或者含有__main__.py的目录,或者含有__main__.py的 zip 压缩包,此时<script>将被添加到sys.path的开头
$ /home/a/b# python __main__.py
/home/a/b
$ /home/a# python b/__main__.py
/home/a/b
$ /home/a# python b
b
$ /home# python a/b
a/b
$ /home# python a/b/__main__.py
/home/a/b
Generic options
-?-h-
--help输出所有命令行选项的简要说明 -
-V --version显示 Python 的版本信息,3.6 后可以通过-VV显示更详细的编译信息(其实就是进入 REPL 时显示的那个)
Miscellaneous options
-
-b当bytes/bytearray和str或者bytes和int进行比较时抛出 warning;-bb则会抛出异常 -
-B不会生成pyc文件 -
--check-hash-based-pycs default|always|neverControl the validation behavior of hash-based .pyc files. See Cached bytecode invalidation. When set to default, checked and unchecked hash-based bytecode cache files are validated according to their default semantics. When set to always, all hash-based .pyc files, whether checked or unchecked, are validated against their corresponding source file. When set to never, hash-based .pyc files are not validated against their corresponding source files. The semantics of timestamp-based .pyc files are unaffected by this option. -
-d输出调试信息,另见PYTHONDEBUG -E忽略所有的PYTHON*环境变量-i执行脚本或者 command(-c) 后进入交互模式。PYTHONSTARTUP中指定的文件不会被读取-I以隔离模式运行 Python。忽略所有的PYTHON*环境变量并且sys.path不会包含脚本所在目录或者 user site-packages 目录-O移除所有的assert语句并且__debug__常量为True。此时编译后的字节码文件名后缀为.opt-1.pyc-OO移除所有的assert语句,抛弃 docstring 并且__debug__常量为True。此时编译后的字节码文件名后缀为.opt-2.pyc-q交互模式不显示 copyright 和版本信息-R开启 hash randomization。因为默认开启所以只有在环境变量PYTHONHASHSEED为 0 的时候这个选项才有效果-s不向sys.path添加 user site-packages 目录-S禁止启动时导入site模块。site模块会修改sys.path并且添加一些 built-in constants 比如exit-u强制 stdout 和 stderr 流不使用缓冲,另见PYTHONUNBUFFERED-v每次对模块进行初始化时都会打印信息,显示加载它的位置,同时在退出时提供模块的析构信息, 另见PYTHONVERBOSE。如果指定-vv则会为搜索模块时检查的每个文件都打印信息-W argWarning 控制。Python 的 warning 机制默认打印 warning 信息到sys.stderr。典型的 warning 信息格式如下:
file:line: category: message
默认每条 warning 只会打印一次(比如在循环内部)。可以给定多个 -W 选项,当有多个选项符合匹配时,将执行最后一个匹配向。虽然无效的 -W 选项将会被忽略,但是在打印第一个 warning 时也会打印有关于无效选项的 warning 信息。另外 warning 可以通过 PYTHONWARNINGS 环境变量和 warnings 模块进行控制
-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-X保留用于各种特定于实现的选项。CPython 当前定义如下:-X faulthandler开启faulthandler-X showrefcount程序结束时或者交互式下每条语句执行后打印书总共的引用计数和占用的内存块。需要在编译时开启 debug-X tracemalloc使用tracemalloc模块去跟踪 Python 的内存分配。默认情况下,只有最近的栈帧会被存储。可以使用-X tracemalloc=NFRAME调整阈值-X showalloccount当程序结束时打印每个类型所分配对象的总数量。需要编译时指定COUNT_ALLOCS-X importtime显示每个导入操作的耗时,比如python3 -X importtime -c 'import asyncio',另见PYTHONPROFILEIMPORTTIME-X dev开启 CPython 的 "development mode"- Add default warning filter, as
-W default. - Install debug hooks on memory allocators: see the
PyMem_SetupDebugHooks()C function. - Enable the
faulthandlermodule to dump the Python traceback on a crash. - Enable
asynciodebug mode. - Set the dev_mode attribute of
sys.flagsto True
- Add default warning filter, as
-X utf8启动 UTF-8 模式-X utf8=0显示关闭 UTF-8 模式
Environment variables
环境变量会影响 Python 的行为,他们会在除了 -E 和 -I 外的所有命令行参数处理前得到处理。通常命令行参数会覆盖掉产生冲突的环境变量
-
PYTHONHOME更改 Python 标准库的位置。默认情况下会在prefix/lib/pythonversion和exec_prefix/lib/pythonversion下搜索。prefix和exec_prefix依赖于安装的目录,通常是/usr/local。当PYTHONHOME被指定为单个目录时,prefix和exec_prefix都将使用此目录。如果要为其分别指定目录,可以将PYTHONHOME设置为prefix:exec_prefix格式 -
PYTHONPATH添加模块的搜索路径。格式和 shell 的PATH相同,不存在的目录将被忽略。除了普通目录外,可以是包含 Python 模块的 zip 文件。默认的搜索路径依赖于安装位置,通常以prefix/lib/pythonverion开头。另见PYTHONHOME,它总是会被添加到PYTHONPATH -
PYTHONSTARTUP如果这是一个可读文件的名称,那么在交互模式显示第一个 prompt 前文件内的代码将会被执行。该文件中的代码和交互式命令运行在同一个命名空间下,以便在交互式命令中使用其定义与导入的对象。可以在此文件中修改sys.ps1和sys.ps2或者sys.__interactivehook__ -
PYTHONOPTIMIZE如果被设置为一个非空字符串则等效于-O选项;如果被设置为一个整数 n 则等效于-O{n} -
PYTHONBREAKPOINT如果设置了这个选项,它的名称应当为以.分隔的 callable。包含这个 callable 的模块会先被导入,然后由sys.breakpointhook()所调用(breakpoint()会调用sys.breakpointhook())。如果不设置或者为空字符串,那么等效于pdf.set_trace。如果设置为字符串"0",那么sys.breakpointhook()会直接返回,不执行任何操作 -
PYTHONDEBUG如果被设置为一个非空字符串则等效于-d选项。如果设置为一个整数 则等效于-d{n} -
PYTHONINSPECT如果被设置为一个非空字符串则等效于-i。这个环境变量可以在 Python 代码中通过os.environ修改从而强制在程序结束时进入交互模式 -
PYTHONUNBUFFERED如果被设置为一个非空字符串则等效于-u选项 -
PYTHONVERBOSE如果被设置为一个非空字符串则等效于-v选项。如果设置为一个整数 则等效于-v{n} -
PYTHONCASEOKOSX 和 Win 环境下有效,import语句将大小写不敏感 -
PYTHONDONTWRITEBYTECODE如果被设置为非空字符串,Python 不会生成.pyc文件。等效于-B选项 -
PYTHONHASHSEED如果这个变量没有被设置或者被设置为random,str、bytes、datetime对象哈希值的种子将为一个随机值。如果PYTHONHASHSEED被设置为一个整数(0 到 4294967295 之间,左闭右开),将使用固定的种子值。特别地,0 表示禁用哈希随机。PYTHONHASHSEED的目的是允许可重复的哈希,例如解释器本身的自测,或允许一组 Python 进程共享哈希值 -
PYTHONIOENCODING如果在运行解释器之前设置了它,将覆盖 stdin/stdout/stderr 的编码。格式为encodingname:errorhandler。二者都是可选的,且和str.encode()具有相同的含义。特别的对于 stderr,errorhandler部分一定会被忽略,永远是backslashreplace -
PYTHONNOUSERSITE如果被设置,Python 不会向sys.path添加 user site-packages 目录 -
PYTHONUSERBASE定义user base directory -
PYTHONEXECUTABLEOSX 下的参数,会覆盖sys.argv[0] -
PYTHONWARNINGS等效于-W参数。如果被设置为逗号分隔的多个字符串,则等效于指定-W多次 -
PYTHONFAULTHANDLER如果被设置为非空字符串,faulthandler.enable()将会在启动时被调用。这将为SIGSEGV,SIGFPE,SIGABRT,SIGBUS,SIGILL信号注册特殊的处理函数来 dump Python 的 trackback。等效于-X faulthanlder选项 -
PYTHONTRACEMALLOC如果被设置为非空字符串,将使用tracemalloc模块去跟踪 Python 的内存分配。此环境变量的值将决定存储在 trackback 中栈帧的上限。比如PYTHONTRACEMALLOC=1将仅存储最近的栈帧 -
PYTHONPROFILEIMPORTTIME如果被设置为非空字符串,Python 将显示import操作的耗时。等效于-X importtime选项 -
PYTHONASYNCIODEBUG如果被设置为非空字符串,则开启asyncio模块的调试模式 -
PYTHONMALLOC设置 Python 的内存分配器或者安装调试钩子 参考文档 -
PYTHONMALLOCSTATS如果被设置为非空字符串,Python 将在 pymalloc memory allocator 每次创建/销毁 arena 时打印统计信息。如果通过PYTHONMALLOC强制使用malloc()或者 Python 没有 pymalloc 支持时,这个环境变量将被忽略 -
PYTHONLEGACYWINDOWSFSENCODING仅 Win 可用 -
PYTHONLEGACYWINDOWSSTDIO仅 Win 可用 -
PYTHONCOERCECLOCALE3.7 新增,详见 PEP 538 -
PYTHONDEVMODE如果被设置为非空字符串,开启 CPython 的 "development mode",等同于-X dev -
PYTHONUTF83.7 新增,详见 PEP 540 -
PYTHONTHREADDEBUG编译 Python 时需要添加-with-pydebug才会存在的环境变量,作用是打印线程调试信息 -
PYTHONDUMPREFS编译 Python 时需要添加-with-pydebug才会存在的环境变量,作用是在解释器运行结束时输出仍然存活的对象和引用计数