Python常用命令提示符使用方法详解

前言

这里的「命令提示符」有两层含义,初学者常常混在一起:一层是操作系统终端里的那个 $ 或 C:\>,另一层是 Python 自己的交互式解释器提示符 >>>。两层提示符之间可以互相跳转,用对了能省下大量「改一行跑一次」的时间。

最常见的误解是:把 >>> 里的语句直接存成 .py 文件,然后抱怨「怎么不输出」。交互模式会自动把每个表达式的结果打印出来(这就是 _ 变量的来源),而脚本模式只执行语句、不自动显示表达式的值------想看到结果必须显式 print()。理解这一点,才理解为什么同一行代码在两个地方「表现不一样」。

本文只讲解释器自身的命令行界面:怎么进入交互模式、-c 与 -m 的区别、怎么从标准输入读代码、--help、启动脚本 PYTHONSTARTUP、交互模式下的 _ 与 help(),以及虚拟环境激活后提示符前面的前缀是怎么来的。示例与命令均针对 Python 3.8 及以上;用到新版本行为时会注明。

顺带纠正一处新旧差异:Python 2.7 已于 2020 年 1 月 1 日 停止维护,它的 raw_input() 在 Python 3 里改名为 input(),而 Python 2 里那个会去 eval 输入内容的 input() 则被彻底移除。所以老教程里在 >>> 下敲 raw_input 的写法,在现在的解释器里只会得到 NameError,请一律换成 input。

一、几种启动方式

解释器命令行的总体形式是:

text 复制代码
python [-bBdEhiIOPqRsSuvVWx?] [-c command | -m module-name | script | -] [args]

方括号里的模块名、脚本名、- 三者互斥,决定了「代码从哪来」。常见的几种:

形式 含义 sys.argv[0]

|--------------------|--------|------|
| python script.py | 执行脚本文件 | 脚本路径 |

|-------------------|-----------|--------|
| python -c "..." | 执行一段命令行代码 | "-c" |

|---------------------|-------------|----------|
| python -m pkg.mod | 按模块导入机制执行模块 | 模块文件完整路径 |

|------------|----------|-------|
| python - | 从标准输入读代码 | "-" |

|----------|---------|------------|
| python | 直接进交互模式 | 无脚本名时为空字符串 |

-c 的 command 可以包含由换行分隔的多条语句,行首缩进有意义。-m 用的是标准的导入机制:参数写模块名、不带 .py 后缀;如果给的是一个包名,解释器会执行该包的 __main__ 子模块。

bash 复制代码
# 面向 bash / zsh 的命令行示意

python -c "import sys; print(sys.version)"

python -m timeit -s "x = list(range(100))" "x[::-1]"

python -m venv .venv

-m 的实用价值在于:它把「当前目录」放进 sys.path 最前面,并且用导入机制查找模块,所以能直接跑标准库里的可执行子模块,例如 timeit、json.tool、venv、http.server。这比记忆这些模块的文件在磁盘上的位置要省事得多。

二、进入交互模式与退出

直接输入 python(没有脚本参数)就进入交互模式,会看到主提示符 >>>;当一条语句还没写完时,出现次提示符 ...:

text 复制代码
$ python

Python 3.11.9 (main, ...) [GCC ...] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> for i in range(3):

...     print(i)

...

0

1

2

>>>

-i 的含义是「执行完之后进入交互模式」。官方文档列出了三种会因 -i 而进入交互的场景:给定脚本文件时、使用 -c 时、使用 -m 时。它有一个很实用的副作用------脚本抛异常后,现场变量还留在命名空间里,可以立刻接着排查:

bash 复制代码
python -i broken_script.py

# 脚本报错后不退出,直接进入 >>> ,此时可以查看局部/全局变量

要注意文档里的一句提醒:-i 下交互模式即使在 sys.stdin 不像终端时也会启动,而且不会读取 PYTHONSTARTUP 。想在没有终端的环境里也进入交互,可以用环境变量 PYTHONINSPECT。

退出交互模式有三种常见方式:exit()、quit(),或者 Windows 上按 Ctrl+Z 再回车、类 Unix 上按 Ctrl+D。exit() / quit() 由 site 模块在启动时注入,属于「给交互用」的便捷对象,不要在正式脚本里依赖它们。

三、从标准输入读代码:python -

python - 表示从标准输入读取代码。文档说明:如果标准输入是终端,-i 会被隐含;如果没给出任何接口选项而直接 python,也是同样效果。

bash 复制代码
# 把文件内容通过管道送进解释器执行

cat snippet.py | python -



# 用 heredoc 直接在命令行里写一段脚本

python - <<'PY'

import sys

print("从标准输入执行", sys.version_info[:2])

PY

python - 与 python script.py 的一个差别在于 sys.argv[0]:前者是 "-",后者是脚本路径。写需要感知「我是怎么被调用的」的工具时,这个值会派上用场。

四、--help 与 -h

python -h 与 python --help 打印一份完整的命令行选项速查,比翻文档快。它的内容是解释器内建的,因此离线也能用:

bash 复制代码
python --help

python -h

python -V      # 只打印版本号

python -VV     # 打印更详细的版本与构建信息

python -VV 除了版本号,还会带上构建信息,比如是否启用了自由线程(no-GIL)构建、编译器类型等。排查「为什么某台机器上的行为不一样」时,这个输出比 -V 有用得多。

五、交互模式下的 _ 与 help()

_(下划线) 是交互模式特有的便利:官方教程说明,在交互模式下,最后一个被打印的表达式会被赋值给变量 _。它让「接着上一次结果算」变得自然:

text 复制代码
>>> 1 + 2

3

>>> _ * 10

30

>>> _ + 1

31

需要说清它的边界:_ 只在交互模式下由解释器维护,脚本文件里没有这个变量 (除非你自己赋值)。而且它记录的是「被打印出来的表达式」,如果上一步是一个赋值语句或返回 None 的调用,_ 不会被更新成 None。

help() 是交互里的内置帮助工具,由 site 模块提供。不带参数调用会进入一个帮助 shell,可以输入模块名、函数名检索;带参数则直接显示对应对象的文档字符串:

text 复制代码
>>> help(str.split)

Help on method_descriptor:



split(self, /, sep=None, maxsplit=-1)

    Return a list of the words in the string, ...

>>> help("modules")

help() 读的是对象上的 __doc__,所以任何写了文档字符串的函数都能这样查。dir(obj) 配合使用更顺:先用 dir() 列出属性名,再用 help() 看具体某个的说明。

六、PYTHONSTARTUP 启动脚本

PYTHONSTARTUP 是一个环境变量,指向一个文件;交互模式在显示第一个提示符之前会执行这个文件里的 Python 命令。文档的关键点是:它被执行在和交互命令同一个命名空间里 ,所以其中定义或导入的对象,在会话里可以直接使用而不必再加限定名;它还可以修改 sys.ps1、sys.ps2,以及 sys.__interactivehook__。

python 复制代码
# 适用于 Python 3.8+

# 存放为 ~/.pythonstartup,然后把环境变量 PYTHONSTARTUP 指到它

import sys



# 自定义提示符;sys.ps1 / sys.ps2 只在交互模式下存在

sys.ps1 = "py> "

sys.ps2 = "... "



# 预导入常用对象,会话里就能直接用

import math

from pprint import pprint
bash 复制代码
# 类 Unix:在 shell 配置里导出环境变量

export PYTHONSTARTUP="$HOME/.pythonstartup"



# Windows cmd:

set PYTHONSTARTUP=%USERPROFILE%\.pythonstartup

两个易被忽略的点:一是上面提到过,-i 隐含进入的交互模式不读 PYTHONSTARTUP;二是 sys.ps1 / sys.ps2 这两个属性只在交互模式下才存在,脚本里访问会 AttributeError,所以启动脚本本身必须只在交互语境下运行,不能当成通用模块导入。

七、虚拟环境提示符前缀从哪来

用 python -m venv 目录名 创建虚拟环境后,提示符前会多出一段 (目录名) 前缀,例如 (myenv) $。这个前缀不是 Python 解释器加的,而是虚拟环境里那套 activate 脚本加的:

bash 复制代码
python -m venv myenv



# 类 Unix

source myenv/bin/activate

# Windows cmd

myenv\Scripts\activate.bat

# PowerShell

myenv\Scripts\Activate.ps1

venv 文档里提供了 --prompt 选项来「为这个环境提供替代的提示符前缀」,所以你想让它显示得更短或更有辨识度,可以在创建时指定:

bash 复制代码
python -m venv --prompt=proj myenv

激活脚本做的主要工作是把这个环境的可执行文件目录放到 PATH 最前面;提示符前缀只是顺带的人性化改动。退出用 deactivate。文档还特意说明:并不一定非得激活才能用虚拟环境 ,直接调用该环境 bin(Windows 下是 Scripts)里的可执行文件也可以,激活更多是为了让 PATH 解析到正确的那一个。

你会看到的提示符 它来自哪里 怎么改变

|--------------|------------|------------|
| $ 或 C:\> | 操作系统 shell | shell 自身配置 |

|---------------|--------------|-----------------|
| >>> / ... | Python 交互解释器 | 不可直接改(除非 C API) |

|--------|----------------|-----------------------|
| py> | 被 sys.ps1 改写 | 在 PYTHONSTARTUP 里赋值 |

|-------------|-------------|----------------------------|
| (myenv) $ | activate 脚本 | --prompt 或修改 activate 脚本 |

常见坑点

坑点 1:把交互模式下能跑的语句直接存成脚本却不 print。 ❌ 交互里敲 2 + 3 看到 5,就以为脚本里写 2 + 3 也会输出。 ✅ 脚本只执行语句、不显示表达式值;想输出要写 print(2 + 3)。交互的自动回显来自它自己的显示钩子。

坑点 2:以为 _ 在脚本里也能用。 ❌ 在 .py 文件里写 print(_) 指望它是上一步结果 ------ 会 NameError。 ✅ _ 只是交互模式的便利变量;脚本里自己用 prev = ... 显式保存。

坑点 3:-c 里粘贴带缩进的多行代码。 ❌ 从前面的缩进块里整段复制进 python -c "..." ------ 3.13 及以前会报 IndentationError。 ✅ 手动去掉外层缩进;Python 3.14 起 -c 会自动 dedent,但别指望旧环境有这个行为。

坑点 4:以为 python -m 名字 要带 .py。 ❌ python -m json.tool.py ------ -m 要的是模块名,不是文件名。 ✅ 写 python -m json.tool;C 扩展模块没有 Python 源文件,不能用 -m 跑。

坑点 5:把 PYTHONSTARTUP 的代码当成项目模块导入。 ❌ 在启动脚本里用 sys.ps1 = "py> ",然后想从别的模块 import 它复用。 ✅ sys.ps1 只在交互模式存在,脚本里访问会 AttributeError;启动脚本只在交互语境运行。

坑点 6:以为 -i 也会执行 PYTHONSTARTUP。 ❌ python -i script.py 后奇怪为什么自定义提示符没生效。 ✅ 文档明确:-i 进入的交互模式不读 PYTHONSTARTUP;需要初始化就单独设置或用其他方式引入。

坑点 7:把 (myenv) 前缀当成「Python 记住了环境」。 ❌ 新开一个终端,看到没有前缀,就以为环境还在------其实只是那一个 shell 的 PATH 被改过。 ✅ 每个新终端都要重新激活;(myenv) 是 activate 脚本改提示符的结果,不是解释器的状态。

坑点 8:用 exit() / quit() 当正式脚本的退出手段。 ❌ 在 .py 文件里结尾写 exit() ------ 它由 site 注入,-S 启动或嵌入式环境里可能不存在。 ✅ 脚本里要退出用 sys.exit(0),语义明确且一定可用。

总结

你想做的事 用的形式 记牢的一点

|-----------|---------------------|--------------------|
| 快速试算、边写边试 | 直接 python 进 >>> | 表达式会自动回显,_ 存上一结果 |

|--------|-------------------|------------------------|
| 跑一小段代码 | python -c "..." | sys.argv[0] 是 "-c" |

|-------------|-----------------|------------------------|
| 跑标准库里的可执行模块 | python -m 模块名 | 不带 .py,会改 sys.path |

|-----------|------------|-------------------|
| 把代码从管道送进来 | python - | stdin 是终端时隐含 -i |

|-----------|-------------------|----------------|
| 脚本出错后继续排查 | python -i 脚本.py | 现场变量还在,但不读启动脚本 |

|---------|-----------------------|------------------------|
| 交互环境个性化 | PYTHONSTARTUP 指向的文件 | 与交互共享命名空间,可改 sys.ps1 |

|------|---------------------|---------------------|
| 隔离依赖 | python -m venv 名字 | 提示符前缀来自 activate 脚本 |

分清「哪种提示符」是理解这一切的关键:>>> 是解释器给的,(venv) $ 是 shell 给的,_ 只活在 >>> 里,sys.ps1 只活在 >>> 里。把 -c、-m、-、-i 这几个开关和它们的 sys.argv[0] 记清楚,脚本「为什么这次路径不对」的问题基本就能自查了。

相关推荐
Crazy________1 小时前
05Linux内存管理核心原理与运维实战
java·开发语言
Nebula_g1 小时前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
扶风ff1 小时前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
程序员老陆1 小时前
C++ 多线程通信方式全景:从共享内存到结构化协调
开发语言·c++
Είναι η κοπέλα1 小时前
模型量化完全指南:GGUF、GPTQ、AWQ 怎么选
人工智能·pytorch·python
yi0111 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
weixin199701080161 小时前
《1688消息服务落地方案:alibaba.message.* 与 Webhook 回调的可靠性与重试策略》(附Python源码)
开发语言·python
ZHOUPUYU1 小时前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
某不知名網友1 小时前
ROS2 核心通信:话题发布与订阅详解
开发语言·c++