为什么用pip安装的库有的可以直接在终端用命令执行?

这个现象,正是Python包管理设计中一个巧妙之处。简单来说,这主要归功于一种叫做“控制台脚本入口点”的机制。

当你 pip install xxx 的时候,实际上装了两个东西:

  1. Python 包(库)
    你在代码里 import xxx 用的就是它。
  2. 可执行脚本(命令行工具)
    这类脚本会被 pip 自动丢到你的系统 PATH 里,所以你在终端能直接敲命令运行。

为什么能直接运行?

比如你安装:

pip install jupyter
pip install gdal

然后你就能直接跑:

jupyter notebook
gdalinfo xxx.tif

原因是:

这些包的 setup.py / pyproject.toml 里写了 console_scripts

[project.scripts]
jupyter notebook = "jupyter:main"

意思是:安装后自动生成一个叫 jupyter notebook 的命令,执行时调用 jupyter.main()

pip 会把这些生成的脚本放到:

  • Windows: Scripts/
  • Linux / Mac: ~/.local/bin/usr/local/bin

这些路径刚好都在你的 PATH 环境变量上,所以你在终端直接输入命令就能执行。

那为啥有的库不能直接用命令?

因为它们 没有声明 console_scripts

例如

pip install numpy

这种你只能:

import numpy

而不是:

numpy

怎么判断某个包有没有命令行工具?

Windows:

C:\Python\Scripts\

Linux/Mac:

~/.local/bin
/usr/local/bin

看看里面有没有对应名字的可执行文件。

我们自己写一个也可以有命令

比如我们写一个工具叫 hello_tool。

pyproject.toml

[project]
name = "hello_tool"
version = "1.0"

[project.scripts]
hello = "hello_tool:main"

hello_tool.py

def main():
    print("hello!小白遥感")

执行:

pip install .
hello

终端就能输出:

hello!小白遥感

image-20251121174217018

总结

有的 pip 包可以在终端直接执行,是因为它们在安装时自动生成了命令行脚本,这些脚本被加入系统 PATH,因此你可以直接用命令运行。