如何在Python中使用FTPlib实现文件的自动化定时上传下载?

冬芳君_9277

冬芳君_9277

2026-11-04

194人浏览

原创

ftplib本身不支持定时,需结合schedule或cron;默认主动模式不适用公网,须显式set_pasv(True);无重试、无连接复用、无SSL自动协商,需手动补足超时、FTP_TLS加密、文件校验等生产级能力。

如何在python中使用ftplib实现文件的自动化定时上传下载?

FTPlib 不适合做自动化定时上传下载——它本身不提供定时能力,且默认不处理被动模式、SSL、连接复用等生产环境必需特性。真正要落地,得靠组合方案:用 ftplib 做协议交互,用外部调度(如 schedule 或系统 cron)控制时机,并手动补足健壮性短板。

为什么直接用 ftplib 写定时脚本容易失败

常见现象是脚本本地能跑通,一放到服务器上就卡在 connect() 或 retrbinary(),甚至上传一半断连不报错。根本原因不是代码写错了,而是 ftplib 默认行为和真实 FTP 服务差异太大:

  • FTP 类默认主动模式(PORT),但绝大多数公网 FTP 服务器禁用该模式,必须显式切换到被动模式:ftp.set_pasv(True)
  • 没有内置重试机制,网络抖动或临时 5xx 响应会导致整个任务中断
  • 连接不自动复用,每次操作都新建 TCP 连接,频繁调用会触发服务器限流(尤其共享主机)
  • 明文传输账号密码,若服务器要求 FTPES(显式 TLS),ftplib.FTP 会直接报 534 Policy requires SSL

用 ftplib.FTP_TLS 安全连接并保持会话

如果目标服务器启用 TLS(越来越常见),必须用 FTP_TLS 替代 FTP,且需在登录后立即调用 auth() 和 prot_p() 启用加密通道:

from ftplib import FTP_TLS
import ssl
<p>ftp = FTP_TLS()
ftp.connect('ftp.example.com', 21)
ftp.auth()  # 发送 AUTH TLS 命令
ftp.prot_p()  # 切换数据连接为加密
ftp.login('user', 'pass')</p><h1>后续 retrbinary / storbinary 都走加密通道</h1><p>with open('local.txt', 'rb') as f:
ftp.storbinary('STOR remote.txt', f)</p><p>ftp.quit()
</p>

注意:FTP_TLS 默认不校验证书,生产环境应传入自定义 ssl_context 防中间人攻击;若服务器证书是自签名,需设 context.check_hostname = False,但仅限内网可信环境。

用 schedule 库实现轻量定时,而非轮询

别用 time.sleep(3600) 死循环——进程挂了就停,日志难追踪,也不支持按周/月等复杂周期。用 schedule 更可靠:

Python Pep Authoring
Python Pep Authoring

依据官方 python/peps仓库规则起草、审阅、编辑或准备 Python 改进提案(PEP),用于处理 PEP 文本和元数据头部。

下载
  • 安装:pip install schedule
  • 每小时执行一次上传:schedule.every().hour.do(upload_file, ftp_host='x', user='y')
  • 每天凌晨 2 点下载:schedule.every().day.at("02:00").do(download_backup)
  • 主循环里加异常捕获,避免单次失败阻塞后续调度:schedule.run_pending(); time.sleep(60)

真正上线时,建议把调度逻辑拆进独立进程(如用 systemd 或 supervisord 管理),而不是丢进 crontab 跑 Python 脚本——前者能自动拉起崩溃进程,后者每次都是新进程,状态无法延续。

文件传输必须加超时和回调,否则不知道卡在哪

ftplib 的 storbinary() 和 retrbinary() 默认无超时,遇到慢速网络或大文件可能挂住几小时。必须显式传参:

  • 连接超时:FTP(timeout=30) 或 FTP_TLS(timeout=30)
  • 传输超时:在 storbinary() 中用 callback 函数分块校验,例如每写入 1MB 打印进度或更新时间戳
  • 关键检查点:上传后务必调用 ftp.size('remote.txt') 对比本地 os.path.getsize(),防止因 FTP 服务器磁盘满导致静默截断

最容易被忽略的是被动模式下数据连接的防火墙穿透问题——如果你的脚本部署在 Docker 容器或 NAT 后,set_pasv(True) 返回的 IP 往往是服务器内网地址,客户端连不上。此时要么改用主动模式(需开放高位端口并配置 ftp.sendcmd('PORT ...')),要么换更现代的库如 pyftpdlib 或直接上 paramiko(SFTP)。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5064

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1809

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

30497

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3627

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3627

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1243

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2823

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程