Python sys 模块
argv, path, exit codes, stdin/stdout, and interpreter limits.
Key Points`sys.argv` is the raw CLI contract; `sys.exit(1)` sets the process status that CI and supervisors read.
Command Line Arguments
sys.argv[0] is the script name; the rest are strings. Beyond two arguments, switch to argparse.
Python
# demo.py
import sys
print(sys.argv)Bash
python3 demo.py --mode prod 8080Output
['demo.py', '--mode', 'prod', '8080']Exit Codes and Streams
sys.exit(0) means success. Logs go to stderr, data to stdout — mixing them breaks downstream pipes.
Python
import sys
def main() -> int:
if len(sys.argv) < 2:
print("usage: demo.py <file>", file=sys.stderr)
return 2
print(f"processing {sys.argv[1]}")
return 0
sys.exit(main())Output
usage: demo.py <file>Path and Interpreter
Python
import sys
print(sys.version.split()[0]) # 3.12.3
print(sys.executable) # 解释器绝对路径
print(sys.platform) # 'win32' / 'linux'
sys.path.insert(0, "/opt/myapp") # 临时加入搜索路径(别写进生产代码)
print(sys.getrecursionlimit()) # 默认 1000Output
3.12.3
/usr/bin/python3
linux
1000Raising the recursion limit turns RecursionError into a segfault. Rewrite recursion as iteration or an explicit stack.
命令行参数
sys.argv[0] 是脚本名,其余是参数,全是字符串。参数一多就该换 argparse。
Python
# demo.py
import sys
print(sys.argv)Bash
python3 demo.py --mode prod 8080Output
['demo.py', '--mode', 'prod', '8080']退出码与标准流
sys.exit(0) 表示成功,非零表示失败。日志写 stderr,数据写 stdout —— 混在一起会让管道下游解析出错。
Python
import sys
def main() -> int:
if len(sys.argv) < 2:
print("usage: demo.py <file>", file=sys.stderr)
return 2
print(f"processing {sys.argv[1]}")
return 0
sys.exit(main())Output
usage: demo.py <file>路径与解释器
Python
import sys
print(sys.version.split()[0]) # 3.12.3
print(sys.executable) # 解释器绝对路径
print(sys.platform) # 'win32' / 'linux'
sys.path.insert(0, "/opt/myapp") # 临时加入搜索路径(别写进生产代码)
print(sys.getrecursionlimit()) # 默认 1000Output
3.12.3
/usr/bin/python3
linux
1000sys.setrecursionlimit(100000) 不是解决递归问题的办法 —— 它只会把 RecursionError 换成段错误。递归改成迭代或显式栈。