
简介这份文档面向疫情期间无法返校、缺少服务器资源的学生与开发者尤其是需要运行 Python3.7 与 PyTorch 代码的计算机视觉学习者讲解如何借助腾讯云短期免费资源完成代码部署。资源包共 1 个 docx 文件大小约 1.18MB内容围绕从领取免费服务器、系统重装、环境依赖导出与上传到 Python3.7 与 CPU 版 PyTorch 安装的完整流程展开并给出 requirements.txt 导出、pip3 安装及终端运行脚本等关键操作思路。目前已有 6532 人学习说明该方案在学生群体中具有较高参考价值。读者可据此快速搭建低成本实验环境理解无 GPU 场景下 PyTorch 的安装选择与依赖处理方式减少因服务器缺失导致的调试阻碍适合作为短期云端运行个人代码的入门指引。1. 腾讯云服务器上跑自己的 Python 代码从上传到常驻一条龙拆解很多人第一次买腾讯云服务器装完 Python、传完代码python main.py一跑SSH 一关进程就没了。第二天打开浏览器接口 502日志里什么都没有。这不是代码写错了是部署方式没选对。这个标题要解决的核心问题就一句话怎么把本地写好的 Python 代码稳定地跑在腾讯云服务器上并且能远程访问、能开机自启、出问题能查。适合手里有一台腾讯云 CVM轻量应用服务器也同理、会基本 Linux 命令、Python 能本地跑通但没正经部署过的开发者。下面按「连上服务器 → 传代码 → 配环境 → 跑起来 → 守住它」的顺序把每一步的命令、参数和翻车点讲清楚。2. 连上腾讯云服务器并传代码别再用 scp 硬传了2.1 先确认你手里的是哪种服务器和登录方式腾讯云的 Python 部署场景绝大多数落在两种实例上CVM 云服务器和轻量应用服务器。两者在部署这件事上差别不大都是 Linux SSH区别主要在防火墙入口的位置——CVM 在「安全组」轻量在「防火墙」面板规则写法类似但入口不同配端口时别找错地方。登录方式有两种密码登录和密钥对登录。密钥对更安全但第一次用容易踩权限坑。拿到服务器后先在本地终端确认能连上# 把 公网IP 换成你腾讯云控制台看到的公网地址 ssh root公网IP # 如果用的是密钥文件腾讯云下载的 .pem chmod 600 ~/Downloads/your_key.pem ssh -i ~/Downloads/your_key.pem root公网IPchmod 600这步不能省。密钥文件权限太开放时SSH 会直接拒绝加载报Permissions 0644 are too open这是新手最常见的第一个翻车点。连上之后先跑uname -a和cat /etc/os-release确认系统版本后面装 Python 的方式跟这个直接相关。2.2 用 rsync 传代码比 scp 和 git clone 都省心传代码有三条路scp、git clone、rsync。我的血泪经验是——代码还在频繁改的阶段用 rsync代码已经稳定用 git。scp每次全量传改一个文件也要重传整个目录项目一大就慢得离谱。# 在本地项目目录的上一级执行把 myproject 整个同步到服务器 rsync -avz --exclude __pycache__ --exclude .venv --exclude *.pyc \ ./myproject root公网IP:/opt/myproject/ # 之后每次改完代码再跑一次同样的命令只传变化的文件参数说明-a保留权限和时间戳-v显示传输详情-z传输时压缩。三个--exclude是关键——__pycache__和.pyc是本地编译产物传上去没用还占空间.venv是本地虚拟环境路径和服务器不一致传上去只会制造混乱。虚拟环境永远在服务器上重建不要从本地传。注意如果服务器没装 rsync先apt install rsync -yUbuntu/Debian或yum install rsync -yCentOS。腾讯云默认镜像一般自带没有就手动装。传完之后在服务器上ls -la /opt/myproject/确认文件到位。目录选/opt是习惯问题你也可以放/home/youruser/但不要放/root下跑业务权限和后续迁移都麻烦。3. 在腾讯云上配好 Python 运行环境版本、虚拟环境、依赖一个都不能少3.1 系统自带 Python 能不能直接用腾讯云的 Ubuntu 镜像通常自带 Python 3.10 或 3.12CentOS 7 自带的是 Python 2.7这个千万别用。先查python3 --version which python3如果版本满足你代码要求比如 3.8可以直接用系统 Python 建虚拟环境。但不要用系统 Python 直接 pip install会污染系统环境某些系统工具依赖特定版本的库装崩了连apt都可能用不了。正确做法是建虚拟环境cd /opt/myproject python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txtpython3 -m venv venv在项目目录下建一个叫venv的隔离环境source venv/bin/activate激活后命令行前缀会出现(venv)之后所有pip install都只装进这个环境。requirements.txt用pip freeze requirements.txt在本地生成确保版本一致。如果系统 Python 版本太低比如你要 3.11 但系统只有 3.8常见做法是用deadsnakesPPAUbuntu或源码编译。源码编译耗时长、依赖多新手容易卡在zlib、ssl缺失上优先考虑换一个高版本系统的镜像重装比在旧系统上折腾编译省事得多。3.2 依赖装不上时先看这三处pip install报错是部署阶段的高频事件按这个顺序排查现象原因解决Could not find a version包名拼错或该版本不存在去掉版本号试装确认包名编译类报错gcc、Python.h缺编译工具和头文件apt install build-essential python3-dev -y下载超时 / 连接重置默认源网络不稳换国内镜像源见下方命令# 临时用清华源装依赖速度立竿见影 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 想永久生效就写进配置 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple镜像源解决的是下载速度不解决版本冲突。如果requirements.txt里两个包依赖同一个库的不同版本pip 会报ResolutionImpossible这时候要手动放宽版本约束或者用pip install逐个装、观察是哪个包引入的冲突。3.3 环境变量和配置文件别写死在代码里数据库密码、API Key 这类东西绝对不要硬编码在 .py 文件里再传到服务器。常见做法是用.env文件加python-dotenv# 在服务器上创建 .env内容只在服务器上存在 cat /opt/myproject/.env EOF DB_HOST127.0.0.1 DB_PASSWORDyour_real_password API_KEYyour_real_key EOF chmod 600 /opt/myproject/.env代码里用os.getenv(DB_PASSWORD)读取。.env要加进.gitignore和 rsync 的--exclude永远不进版本库、不从本地传。chmod 600保证只有属主能读同服务器上的其他用户看不到。4. 让 Python 代码在腾讯云上常驻nohup、systemd、screen 怎么选4.1 为什么 python main.py 一关 SSH 就死SSH 会话结束时会向该会话启动的所有前台进程发SIGHUP信号默认行为是终止进程。所以python main.py直接跑关掉终端就没了。解决办法是让进程脱离终端会话或者交给系统服务管理器托管。三种主流方案对比如下方案适合场景开机自启崩溃重启查看日志nohup 临时跑、快速验证否否手动重定向文件screen / tmux交互式调试、临时后台否否进入会话看systemd正式服务、长期运行是是journalctl正式部署一律用 systemd前两种只适合临时验证。下面重点讲 systemd。4.2 写一个 systemd unit 把 Python 服务管起来假设你的入口是/opt/myproject/main.py虚拟环境在/opt/myproject/venv创建一个服务单元# /etc/systemd/system/myproject.service [Unit] DescriptionMy Python Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/opt/myproject EnvironmentPATH/opt/myproject/venv/bin ExecStart/opt/myproject/venv/bin/python /opt/myproject/main.py Restartalways RestartSec5 StandardOutputappend:/var/log/myproject.log StandardErrorappend:/var/log/myproject.err [Install] WantedBymulti-user.target逐项说明WorkingDirectory决定代码里相对路径的基准不设的话open(data.json)会找不到文件ExecStart必须写虚拟环境里 python 的绝对路径写python会用到系统 Python依赖全找不到Restartalways让进程崩溃后自动拉起RestartSec5是重启前等 5 秒避免疯狂重启刷爆日志Environment把虚拟环境的 bin 目录加进 PATH某些包调用子进程时依赖这个。启用并启动systemctl daemon-reload systemctl enable myproject systemctl start myproject systemctl status myprojectdaemon-reload在每次改完 unit 文件后都要跑否则 systemd 用的还是旧配置。enable是设置开机自启start是立即启动。status看到绿色的active (running)就成功了。4.3 日志和端口服务跑起来了但访问不到怎么办服务active但外部访问不通九成是这两个原因监听地址不对或防火墙没放行。先看监听地址。如果代码里写app.run(host127.0.0.1, port8000)那只有服务器本机能访问外部一律拒绝。要改成host0.0.0.0# Flask 示例 app.run(host0.0.0.0, port8000) # FastAPI 用 uvicorn 启动 # uvicorn main:app --host 0.0.0.0 --port 8000再查防火墙。腾讯云有两层系统内的防火墙ufw/firewalld和云控制台的安全组/防火墙。两层都要放行才算通。# Ubuntu 查看 ufw 状态并放行 8000 ufw status ufw allow 8000/tcp # CentOS 用 firewalld firewall-cmd --add-port8000/tcp --permanent firewall-cmd --reload控制台那层CVM 进「安全组」加一条入站规则轻量应用服务器进「防火墙」加规则协议 TCP、端口 8000、来源0.0.0.0/0或限定你的 IP 更安全。只配了系统防火墙没配安全组是最隐蔽的坑本地curl 127.0.0.1:8000通、外部死活连不上就是它。5. 部署腾讯云 Python 服务的避坑清单五个真实翻车现场5.1 坑一改了代码忘了重启服务现象rsync 传了新代码访问接口还是旧逻辑日志里看不到新加的打印。原因systemd 托管的进程加载的是启动那一刻的代码文件更新不会自动重载。解决每次传完代码执行systemctl restart myproject。嫌麻烦可以写个部署脚本把 rsync 和 restart 串起来#!/bin/bash set -e rsync -avz --exclude __pycache__ --exclude .venv --exclude .env \ ./myproject/ root公网IP:/opt/myproject/ ssh root公网IP systemctl restart myproject systemctl status myproject --no-pagerset -e让脚本在任一步失败时立即停止避免传了一半还去重启。5.2 坑二虚拟环境路径写成了相对路径现象systemctl status显示failed日志报No such file or directory或ModuleNotFoundError。原因ExecStart里写了venv/bin/python这种相对路径systemd 不认它不按WorkingDirectory解析可执行文件路径。解决ExecStart和Environment里的路径全部写绝对路径/opt/myproject/venv/bin/python这样。5.3 坑三requirements.txt 没锁版本重装后行为变了现象本地跑得好好的服务器上装完依赖某个库行为不一样报参数错误。原因requirements.txt里写的是flask而不是flask3.0.0服务器装到了更新的版本API 变了。解决本地用pip freeze requirements.txt生成带精确版本的文件部署时严格按它装。升级依赖要单独测试别在生产环境随手pip install -U。5.4 坑四日志文件把磁盘写满现象服务跑几天后突然挂了df -h一看磁盘 100%。原因StandardOutputappend:/var/log/myproject.log只追加不切割日志越滚越大。解决用 logrotate 切割或者干脆交给 journald 管理去掉StandardOutput那两行用journalctl -u myproject看日志journald 自带大小限制。要保留文件日志就配 logrotate# /etc/logrotate.d/myproject /var/log/myproject.log { daily rotate 7 compress missingok notifempty }意思是每天切割、保留 7 份、压缩旧文件。5.5 坑五用 root 跑业务还开了弱密码 SSH现象服务器 CPU 跑满top里有个不认识的进程在挖矿。原因root 密码太弱SSH 22 端口对公网开放被暴力破解。解决三件事一起做——改用密钥登录、禁用密码登录、禁止 root 直接 SSH。改/etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no改完systemctl restart sshd。改之前务必确认密钥能登录、且有一个非 root 的 sudo 用户否则会把自己锁在门外只能去控制台走 VNC 救援。业务进程用普通用户跑systemd unit 里User改成那个用户。6. 进阶用 Docker 把腾讯云上的 Python 部署变成一次性的前面那套 venv systemd 的方案换一台服务器就要重来一遍依赖版本、系统差异都可能让「在我机器上能跑」再次上演。想让部署可复制进阶做法是用 Docker 把 Python 代码和它的运行环境一起打包。腾讯云服务器上装 Docker 很简单curl -fsSL https://get.docker.com | bash systemctl enable docker systemctl start docker然后在项目里写DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY . . EXPOSE 8000 CMD [python, main.py]FROM python:3.11-slim直接给你一个带 Python 3.11 的干净底包不用再操心系统 Python 版本WORKDIR /app设定工作目录先COPY requirements.txt再RUN pip install是利用镜像层缓存——只要依赖没变重新构建时这层直接复用改代码不会触发重装依赖构建从几分钟缩到几秒。构建和运行docker build -t myproject:latest . docker run -d --name myproject \ --restart always \ -p 8000:8000 \ --env-file /opt/myproject/.env \ myproject:latest--restart always等价于 systemd 的Restartalways容器退出自动拉起-p 8000:8000把容器端口映射到宿主机--env-file把.env注入容器代码里照样os.getenv读。日志用docker logs -f myproject看进容器排查用docker exec -it myproject bash。Docker 方案的好处是本地和服务器跑的是同一个镜像环境差异被彻底消除迁移服务器时只要把镜像推走或重新 build不用重装 Python、重配依赖。代价是多了一层要理解的概念镜像和容器占磁盘docker system prune要定期清理。我的习惯是——临时验证和小脚本用 venv systemd正式对外服务一律 Docker前者快后者稳且可复制。最后说个我自己的教训部署这件事能自动化的绝不留手动步骤。我早期每次更新代码都是 SSH 上去git pull再手动重启有一次改到一半网络断了服务处于半死不活的状态排查了半小时。后来写成一条 rsync restart 的脚本再没出过这类问题。把「传代码 → 重启 → 看状态」固化成一条命令是省下最多后悔药的一步。希望帮到你。本文还有配套的精品资源点击获取