零基础也能上手:Ubuntu 24.04 云服务器 Python 开发环境从零搭建

📅 发布时间:2026/7/25 15:28:18
零基础也能上手:Ubuntu 24.04 云服务器 Python 开发环境从零搭建 零基础也能上手Ubuntu 24.04 云服务器 Python 开发环境从零搭建本文是《Python 实战》基础篇的第一篇。所有命令和回显都来自我在一台真实云服务器上的实操没有任何想当然的输出。如果你也打算在云上写 Python照着敲一遍基本能避开我踩过的每一个坑。背景为什么写这篇前不久带几个刚入行的同学上云十个人里有八个在第一步就卡住了——pip install一敲屏幕蹦出一大段红字看不懂再一搜有人教他们加--break-system-packages于是环境直接被装花。我自己刚用 Ubuntu 24.04 的时候也犯过类似的错。这篇文章想做一件事把在云服务器上把 Python 环境搭对这件事用真实回显摊开给你看。不绕弯子不藏着报错踩坑的过程原样保留。为什么非得在云服务器上折腾 Python本地装个 Anaconda 不香吗香但很多活儿本地干不了定时跑的数据抓取脚本要 7×24 在线微信/钉钉机器人要一个常驻进程训练任务的 GPU 在云上、本地没有还有各种需要公网 IP 的服务。这些场景都要求你能在裸 Linux 上把 Python 环境独立、干净地搭起来并且能稳定复现。我自己的习惯是本地只写代码和做轻量验证真正跑业务一定上云、一定进虚拟环境。这篇文章就是把这个上云第一步彻底讲透。后面所有命令你都能直接复制去敲建议边读边在终端里跟着跑比单纯看印象深得多。环境说明真实回显先交代我手头这台机器的情况。下面是我在服务器上敲的命令和真实返回$uname-aLinux ecs-3d3b-00026.8.0-106-generic#106-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 6 07:58:08 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux$cat/etc/os-release|head-n5PRETTY_NAMEUbuntu 24.04.4 LTSNAMEUbuntuVERSION_ID24.04VERSION24.04.4 LTS (Noble Numbat)VERSION_CODENAMEnoble $ python3-Vwhichpython3whichpip3||truePython3.12.3 /usr/bin/python3 /usr/bin/pip3可以看到内核是 6.8系统是 Ubuntu 24.04.4 LTS代号 Noble Numbat系统自带的 Python 是3.12.3且pip3已经在/usr/bin/pip3。这一点很关键从 Ubuntu 23.04 开始系统层面的 Python 被标记为外部管理环境externally-managed-environment这正是后面 PEP 668 报错的源头。一、用 apt 安装 python3-venv 和 pip做 Python 开发虚拟环境venv是标配。我先更新软件源再安装python3-venv和python3-pip$apt-getupdate-yHit:1 http://repo.huaweicloud.com/ubuntu noble InRelease Hit:2 http://repo.huaweicloud.com/ubuntu noble-updates InRelease Hit:3 http://repo.huaweicloud.com/ubuntu noble-backports InRelease Hit:4 http://repo.huaweicloud.com/ubuntu noble-security InRelease Reading package lists... $apt-getinstall-ypython3-venv python3-pip Reading package lists... Building dependency tree... Reading state information... python3-venv is already the newest version(3.12.3-0ubuntu2.1). python3-pip is already the newest version(24.0dfsg-1ubuntu1.3). The following packages were automatically installed and are no longer required: eatmydata libeatmydata1 python-babel-localedata python3-babel python3-jinja2 python3-json-pointer python3-jsonpatch python3-jsonschema python3-markupsafe python3-pyrsistent python3-tz Useapt autoremoveto remove them.0upgraded,0newly installed,0to remove and141not upgraded.说明一下这台云镜像其实已经预装了python3-venv和python3-pip所以apt提示 “already the newest version”并没有真正安装新东西。但这条命令本身没有错建议你不管镜像有没有预装都跑一遍确认免得后面python3 -m venv时告诉你venv模块不存在。装完顺手验证一下可用性和版本$ python3-Vpython3-mvenv--help/dev/null21echovenv OKpip3--versionPython3.12.3 venv OK pip24.0from /usr/lib/python3/dist-packages/pip(python3.12)venv OK说明虚拟环境模块能正常加载pip 24.0也确认了包管理器在位。二、第一次翻车直接 pip3 install 触发 PEP 668很多教程会让你直接pip install装个库试试。在 Ubuntu 24.04 上这一步必翻车。我故意复现了一次$ pip3installrich error: externally-managed-environment × This environment is externally managed ╰─ToinstallPython packages system-wide, tryaptinstallpython3-xyz, where xyz is the package you are trying to install. If you wish toinstalla non-Debian-packaged Python package, create a virtual environment using python3-mvenv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make sure you have python3-full installed. If you wish toinstalla non-Debian packaged Python application, it may be easiest to use pipxinstallxyz,whichwill manage a virtual environmentforyou. Make sure you have pipx installed. See /usr/share/doc/python3.12/README.venvformoreinformation. note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages. hint: See PEP668forthe detailed specification.这就是 PEP 668 的外部管理环境保护机制在起作用。它的本意是系统自带的 Python 是操作系统很多组件apt、cloud-init 等的依赖如果你用 pip 往系统里乱塞包很可能和系统包管理器apt管理的版本冲突把系统搞坏。多说一句背景免得你以为这是 Python 的怪脾气。PEP 668 是 2022 年被接受的规范核心诉求是当操作系统自带的包管理器Debian/Ubuntu 的 apt、Red Hat 的 dnf也在管 Python 时pip 不应该再往同一个全局site-packages里写东西否则两套包管理器会互相踩脚。从 Ubuntu 23.04 起官方镜像就默认带上了EXTERNALLY-MANAGED标记文件所以你一装系统 Python 就处于被保护状态。换句话说这个报错不是拦你是替你兜底——它逼着你养成项目级隔离的习惯而这恰恰是专业开发和随手乱装的分水岭。重点提醒报错末尾那句 “you can override this … by passing--break-system-packages” 是个陷阱不是给你日常用的。我见过有人照着加了这个参数结果升级系统 Python 时直接崩。正解是——进虚拟环境。三、用 venv 正确隔离环境创建一个专属虚拟环境激活它再安装包问题迎刃而解$cd/root/lab-apython3-mvenv venvechovenv createdlsvenv/bin venv created activate activate.csh activate.fish Activate.ps1 pip pip3 pip3.12 python python3 python3.12venv目录下多了一套独立的python和pip和系统彻底隔离。激活它注意source后面跟bin/activate$cd/root/lab-asourcevenv/bin/activatepython-Vpipinstall-ihttps://repo.huaweicloud.com/repository/pypi/simple--upgradepip-qpipinstall-ihttps://repo.huaweicloud.com/repository/pypi/simple ipython rich-qechoINSTALL_DONEPython3.12.3 INSTALL_DONE这里我装了ipython增强版交互解释器和rich终端美化库。一个小经验在华为云这类国内云上直接连官方 PyPI 源经常慢到超时我加了-i https://repo.huaweicloud.com/repository/pypi/simple走华为云镜像几秒钟就装完了。如果你在其他云换成对应厂商的 PyPI 镜像即可。激活虚拟环境后命令行提示符通常会多一个(venv)前缀表示你正身处隔离环境之中。顺便说下 venv 的原理免得把它想得太玄它本质上是在目标目录里放了一份 Python 解释器的软链接外加一份独立的site-packages。所以创建 venv 几乎不占空间、秒级完成激活之后python和pip都指向这份隔离副本装包只会写进 venv 自己的目录绝不会碰系统一分一毫。理解了这点你就再也不会怕建环境了——放心建一个项目一个哪天不要了直接删文件夹干净利落不像全局装包那样卸载时总担心漏删依赖。四、跑通第一行代码环境到位写第一行代码验一下$cd/root/lab-asourcevenv/bin/activatepython-cprint(hello from venv, python, __import__(sys).version.split()[0])hello from venv, python3.12.3能在虚拟环境里打印出3.12.3说明这套环境已经能正常干活了。五、动态调试python3 -m pdb代码不会一遍写对调试是日常。pdb是 Python 自带的命令行调试器不用装任何东西。我准备了一个故意留 bug 的脚本buggy.py它想算 5 的阶乘却返回 0deffactorial(n):r1foriinrange(n):# 故意留的 bugrange(n) 从 0 开始会把结果乘成 0r*ireturnrprint(factorial(5) ,factorial(5))# 期望 120实际输出 0用pdb -c把调试命令传进去复现一个干净的排查过程-c可以多次使用依次执行$cd/root/lab-apython3-mpdb-cl-cb 4-cc-cp i-cp r-cn-cp r-cc-cqbuggy.py1-def factorial(n):2r13foriinrange(n):# 故意留的 bugrange(n) 从 0 开始会把结果乘成 04r *i5returnr67print(factorial(5) , factorial(5))# 期望 120实际输出 0[EOF]Breakpoint1at /root/lab-a/buggy.py:4010解读这次会话l列出源码b 4在第 4 行r * i下断点c让程序跑到断点停下此时p i打印出0、p r打印出1——注意循环变量i从 0 就开始了n单步执行这一行把r乘上i也就是 0再p r得到0。根因一目了然range(n)生成的是0..n-1第一轮就把累积值乘成了 0。正确写法应是range(1, n1)。这种看一眼变量就破案的体验就是 pdb 的价值。小提示如果你在交互终端里调试直接python3 -m pdb buggy.py然后敲l、n、p 变量名、q就行非交互场景比如写进脚本批量跑用-c传命令最稳避免管道喂命令时 pdb 提前读到 EOF 重启程序。六、查官方文档help() 与 dir()遇到不熟悉的模块或对象别急着搜百度Python 自带的文档就在手边。dir()列出对象支持的所有属性和方法配合字符串过滤很方便$cd/root/lab-apython3-cprint([m for m in dir() if strip in m])[lstrip,rstrip,strip]help()直接拉出官方文档比如看看math.sqrt的签名和说明$cd/root/lab-apython3-cimport math; help(math.sqrt)Help on built-infunctionsqrtinmodule math: sqrt(x, /)Return the square root of x.比起翻网页help()给的是当前环境里这个版本的确切说明最不容易过时。七、虚拟环境的日常查看依赖、导出与退出环境搭好、包装好之后还有几个我几乎每天都会用到的操作趁热打铁记一下。先看当前环境到底装了些什么$cd/root/lab-asourcevenv/bin/activatepip list2/dev/null|head-n12Package Version ----------------------- ------- asttokens3.0.2 decorator5.3.1 executing2.2.1 ipython9.15.0 ipython_pygments_lexers1.1.1 jedi0.20.0 markdown-it-py4.2.0 matplotlib-inline0.2.2 mdurl0.1.1 parso0.8.7pip list把环境里所有第三方包和版本号列出来前面装的ipython 9.15.0赫然在列说明它确实装进了虚拟环境而不是系统里。把依赖导出成requirements.txt是协作和部署里最标准的一步$cd/root/lab-asourcevenv/bin/activatepip freeze2/dev/null|head-n6deactivateechoDEACTIVATEDasttokens3.0.2decorator5.3.1executing2.2.1ipython9.15.0ipython_pygments_lexers1.1.1jedi0.20.0 DEACTIVATEDpip freeze输出的是包名精确版本号的锁定格式把它重定向到requirements.txt后换一台机器只要执行pip install -r requirements.txt就能复现出一模一样的环境。这条命令在团队开发、CI 流水线和容器镜像构建里都是标配原因很简单Python 项目的可复现几乎全靠这个锁文件撑着否则别人拉了你的代码却装了一堆不同版本的依赖bug 根本没法对齐。这里我还顺手演示了deactivate——退出虚拟环境。退出后命令行提示符上那个(venv)前缀会消失此时再用pip就又指向系统 Python 了。这引出一个我见过很多人犯的低级错误装包前一定要先看一眼提示符带不带(venv)。我经常一边开着多个终端有的在环境里、有的在系统里装完包发现 import 报错多半就是装错地方了。养成激活→装包→用完 deactivate的习惯能省掉大量这种乌龙。踩坑清单现象根因正确做法pip3 install报externally-managed-environmentUbuntu 24.04 启用 PEP 668禁止污染系统 Python用python3 -m venv建虚拟环境在环境内安装报venv 模块不存在镜像没装python3-venv先apt-get install -y python3-venv想加--break-system-packages强行装被报错末尾提示误导坚决不用除非你清楚在干什么且只影响一次性容器pip 安装卡住/超时默认连官方 PyPI 源慢加-i走云厂商 PyPI 镜像pdb 管道喂命令出现[EOF]重启程序非交互下 stdin 提前耗尽用python3 -m pdb -c 命令多次传参总结在 Ubuntu 24.04 云服务器上搭 Python 环境核心就一句话永远在虚拟环境里装包别碰系统 Python。PEP 668 的报错不是障碍是保护venvpip的组合足以覆盖 99% 的日常开发pdb和help()/dir()则是零成本的自带工具关键时刻能省下大量搜网页的时间。回过头看这一篇没讲什么高深东西全是最朴素的几条命令。但恰恰是这些朴素命令决定了你后续所有 Python 项目的地基稳不稳。我在好几个线上事故里见过根因有人为了图快加--break-system-packages全局装包结果系统 Python 被带崩连apt都跑不了有人把依赖写死在系统里换机器部署时差了三个版本定位花了半天。所以别嫌啰嗦——把venv刻进肌肉记忆比学十个框架都值钱。下一篇我会基于这套环境实打实过一遍 Python 3.12 的核心语法从数据类型、f-string、浮点精度坑到列表/字典/|合并运算符、match 模式匹配再到计算器和通讯录两个小实战。本文实验均在华为云 Flexus X 实例Ubuntu 24.04, Python 3.12.3上真实执行。