把写好的py脚本放到服务器上,核心路径只有三步:选一台能访问的服务器、用scp或SFTP把文件传上去、在服务器上装好Python环境并运行脚本。整个过程不复杂,但细节决定了脚本能不能稳定跑起来,尤其是路径、依赖和后台运行这三个坑,本文逐一拆开讲清楚。
把python脚本部署到服务器前需要准备什么
在动手传文件之前,先把准备工作做扎实,很多新手卡在第一步就是以为写好的脚本直接扔上去就能跑,实际上服务器环境和本地有差异。
服务器选购与登录方式
服务器没有统一标准,但选择方向很明确,如果你是个人项目或学习用途,云服务器比物理服务器更划算,按量付费模式灵活,不用了可以释放,据行业共识,简米云、酷番云、华为云的轻量应用服务器对个人开发者友好,新用户活动价常年在百元以内一年,适合练手。
操作系统建议选Ubuntu 20.04或22.04 LTS,Python环境好配,社区资料也最丰富,登录方式用SSH,Windows用户用PowerShell或Windows Terminal自带的ssh命令,macOS直接打开终端。
ssh 用户名@服务器公网IP
输入密码后进入服务器终端,这是后续所有操作的基础入口。
服务器端Python环境确认
登录服务器后先检查Python版本,输入:
python3 --version
如果提示找不到命令,先安装,Ubuntu系统执行:
sudo apt update sudo apt install python3 python3-pip python3-venv
这里有一个容易忽略的问题:服务器的Python版本可能和本地不一致,比如本地用Python 3.12写的代码用了新语法,服务器如果是3.8就跑不起来,行业惯例是开发和生产环境版本保持一致,或者用venv隔离依赖。
py脚本上传到服务器的两种常用方式
传输文件方法不少,但日常用得最多的是两种:scp命令和SFTP图形化工具,前者适合命令行老手,后者对Windows用户更友好。
用scp命令直接上传
scp是基于SSH的文件传输命令,一条命令搞定,在本地终端执行:
scp /本地路径/你的脚本.py 用户名@服务器公网IP:/目标路径/
举例说明,本地有个爬虫脚本在/Users/me/Projects/spider.py,要放到服务器的/home/ubuntu/scripts目录下:
scp /Users/me/Projects/spider.py ubuntu@1.2.3.4:/home/ubuntu/scripts/
执行后输入服务器密码,文件就传上去了,如果需要传整个文件夹,加-r参数:
scp -r /本地项目目录 ubuntu@1.2.3.4:/home/ubuntu/
这种方式适合临时传单个文件或小项目,零额外工具成本。
用SFTP工具可视化操作
如果你不习惯命令行,FileZilla和WinSCP是Windows用户常用的SFTP客户端,免费开源,连接配置和SSH一样,填主机IP、用户名、密码、端口22,连接成功后左侧本地目录、右侧服务器目录,直接拖拽文件即可。
这里有一个实操细节:脚本依赖的数据文件或配置文件要一并上传,不要只传一个.py文件,很多脚本报错FileNotFoundError就是因为缺少配套的JSON或CSV文件。
在服务器上安装依赖并测试运行
文件传上去后,先别急着跑。依赖安装是脚本能否运行的关键环节。
创建虚拟环境管理依赖
在服务器上为每个项目单独建虚拟环境是行业推荐做法,避免不同项目依赖冲突,进入项目目录后执行:
cd /home/ubuntu/scripts python3 -m venv venv source venv/bin/activate
激活后在命令行前缀会显示(venv),说明当前在虚拟环境中,然后安装依赖:
pip install 依赖包名
如果本地有requirements.txt文件,一条命令装完所有依赖:
pip install -r requirements.txt
建议在本地用pip freeze > requirements.txt导出依赖清单,随脚本一同上传,服务器上直接安装。
前台运行与日志输出测试
依赖装好后,先在前台运行一次测试:
python3 你的脚本.py
观察输出是否正常,有没有报错,如果脚本本身需要长期运行,比如爬虫或定时任务,直接前台跑会占用终端,关闭SSH窗口就中断了,这时需要后台运行方案。
python脚本放到服务器上之后如何后台长期运行
后台运行是生产环境最常见的需求,这里介绍三种方案,按推荐程度排序。
nohup加后台运行
最简单的方式:
nohup python3 你的脚本.py > 日志文件.log 2>&1 &
nohup让进程忽略挂断信号,&表示后台运行,日志重定向到文件,查看运行状态:
ps aux | grep 你的脚本.py
停止脚本:
kill 进程PID
这种方式适合快速验证和简单场景,但缺点是服务器重启后脚本不会自动恢复。
systemd服务管理
行业共识是,生产环境用systemd管理Python服务最可靠,在/etc/systemd/system/下新建一个服务文件,比如my-script.service:
[Unit] Description=My Python Script After=network.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/scripts ExecStart=/home/ubuntu/scripts/venv/bin/python3 你的脚本.py Restart=always RestartSec=3 StandardOutput=append:/home/ubuntu/scripts/脚本.log StandardError=append:/home/ubuntu/scripts/错误.log [Install] WantedBy=multi-user.target
重点说明:ExecStart里写虚拟环境中的Python绝对路径,而不是系统自带的python3,这样能确保用的是已装好依赖的环境,保存后执行:
sudo systemctl daemon-reload sudo systemctl start my-script sudo systemctl enable my-script
enable设置开机自启,查看状态和日志:
sudo systemctl status my-script sudo journalctl -u my-script -f
这套方案的好处是崩溃自动重启、开机自动启动,运维成本最低。
定时任务场景
如果脚本是定时执行的,比如每天跑一次数据统计,直接配置crontab:
crontab -e
在打开的编辑器中写入:
0 3 /home/ubuntu/scripts/venv/bin/python3 /home/ubuntu/scripts/你的脚本.py >> /home/ubuntu/scripts/定时日志.log 2>&1
这表示每天凌晨3点执行一次,日志追加到指定文件,注意crontab里也要用绝对路径,相对路径在定时任务中容易出错。
常见坑位排查与实用技巧
部署过程中难免遇到问题,这里整理几个高频场景和对应解法。
端口与防火墙
脚本如果起了Web服务,比如Flask或FastAPI应用,外界访问不了先查安全组入方向规则,云服务器在控制台有安全组配置,默认只开放22端口,需要手动放行脚本使用的端口,比如8000或8080,同时服务器防火墙也要放行:
sudo ufw allow 8000/tcp
文件权限问题
上传的脚本如果没有执行权限,运行时会报Permission denied,给脚本加权限:
chmod +x 你的脚本.py
如果脚本需要写入数据文件,确保运行用户对目录有写权限:
sudo chown -R ubuntu:ubuntu /home/ubuntu/scripts
路径硬编码问题
本地调试时open("data.txt")没问题,但放在服务器上工作目录不同就会报找不到文件,脚本统一用绝对路径,或者基于__file__动态获取路径:
import os base_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(base_dir, "data.txt")
这个习惯在部署场景下能节省大量排查时间。
Windows换行符问题
Windows本地写的脚本传到Linux服务器,有时运行报SyntaxError: unexpected character after line continuation character,这是换行符差异导致的,转换方法:
sed -i 's/\r$//' 你的脚本.py
或者用dos2unix工具处理。
Flask和Django项目部署的特殊处理
如果你的“脚本”其实是Web应用,部署方式略有不同,开发服务器的性能不足以应对线上流量,行业惯例是用Gunicorn或uWSGI作为WSGI服务器,配合Nginx反向代理。
安装并启动Gunicorn:
pip install gunicorn nohup venv/bin/gunicorn -w 4 -b 0.0.0.0:8000 你的应用模块:app > gunicorn.log 2>&1 &
Nginx配置代理转发,将80端口的请求转发到8000端口,这套组合是Python Web应用部署的成熟方案,能承受较大并发量。
运维监控小建议
部署完成只是开始,日常监控也很重要,简单方案是用crontab定时检查进程状态,发现挂了自动重启:
/5 pgrep -f 你的脚本.py || /home/ubuntu/scripts/venv/bin/python3 /home/ubuntu/scripts/你的脚本.py >> /home/ubuntu/scripts/日志.log 2>&1
每5分钟检查一次进程,不存在就拉起来,日志方面用logrotate做日期轮转,避免日志文件无限增大撑满磁盘,这些都是低成本高回报的运维手段,建议部署完成后顺手加上。
python脚本服务器部署失败怎么办
遇到问题先看日志,这是排查的第一原则,前台运行能直接看到报错信息,后台运行翻日志文件。日志里最后几行通常就是根因,定位到问题后,先在本地复现同样的条件测试,修改后再上传覆盖文件,循环这个流程。
如果依赖安装很慢,配置国内镜像源加速:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
服务器内存紧张时,大型Python项目可以考虑用swap扩展虚拟内存,能缓解内存不足导致的进程被系统杀掉的问题。
关于云服务器选择与价格的一些参考
国内云服务器价格差异较大,体验上也有区分,新手阶段轻量应用服务器性价比高,配置1核2G内存、3M带宽的价格通常在一年几十到两百元区间,不同地域和促销周期波动明显,香港或海外节点免备案,但延迟相对高一些,适合有跨境业务需求的场景,国内节点的延迟稳定,首次购买需要在控制台完成备案流程,选择哪家服务商,核心看三点:售前客服响应速度、控制台易用性、文档完整度,个人开发者推荐从熟悉生态的云厂商开始,遇到问题能快速找到解决方案。
把Python脚本部署到服务器,本质是环境迁移和进程管理的组合题,先确认服务器环境,再上传文件和依赖,测试前台运行,最后用systemd或crontab固化运行方式,记住三个关键点:虚拟环境隔离依赖、绝对路径写清楚、日志留好方便定位问题,把这三件事做到位,脚本部署就不再是玄学,而是一个可复用的标准流程。
python脚本部署到服务器后无法运行如何处理
Q:脚本在本地运行正常,上传到服务器后报ModuleNotFoundError,怎么解决?
A:这是依赖缺失的典型症状,在服务器终端执行pip list查看已安装的包,与本地pip list对比,解决方案是先激活虚拟环境,用python3 -m pip install 包名安装缺失依赖,如果项目有requirements.txt,直接执行pip install -r requirements.txt一次性补齐全部依赖。
Q:脚本后台运行一段时间后自动停止,找不到原因怎么办?
A:先看日志文件尾部有没有异常输出,常见原因是内存不足触发OOM Killer,用dmesg | grep -i oom查看系统日志确认,解决方案是优化脚本内存占用,或者给服务器增加swap空间,若脚本是崩溃退出,改用systemd管理并设置Restart=always,系统会自动拉起进程。
Q:Windows本地写的脚本,服务器是Linux,需要注意哪些差异?
A:文件路径分隔符不同,Windows用\而Linux用,脚本中统一使用os.path.join()处理,换行符不同,用dos2unix转换或sublime text保存时选择LF换行,编码方面确保文件保存为UTF-8无BOM格式,避免中文注释导致的解码报错,依赖方面Linux需要编译环境才能装部分包,使用apt install先安装build-essential等基础工具。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771761.html


