Python脚本中的[Errno 32]Broken pipe错误在Crontab中

2 投票
2 回答
1384 浏览
提问于 2025-04-16 10:50

我在运行一个Python脚本,这个脚本可以从FTP上下载PDF文件。手动运行这个脚本的时候一切都很顺利,但当我把它放到Ubuntu机器的定时任务(crontab)里去执行时,却出现了一个错误:[Errno 32] Broken pipe。你知道这是为什么吗?我该怎么解决这个问题呢?

2 个回答

0

我刚刚解决了一个“Broken Pipe(32)”的错误,这个错误在使用ftplib时可能会出现,无论是在全局范围内还是在函数内部。

import ftplib
from time import sleep
ftp_handle = ftplib.FTP(host,user,pass)
ftp_handle.encoding = 'utf-8'
def func1():
    ftp_handle = ftplib.FTP(host,user,pass)
    ftp_handle.encoding = 'utf-8'
    ftp_handle.nlst()
    ftp_handle.quit()
while(1):
    now = datetime.now()
    print(now)
    try:
        func1()
    except Exception as e:
        print(e)
    sleep(10)

在函数内部,它使用了一个局部变量,这样就创建了另一个FTP实例。过了一段时间,根据FTP服务器的超时设置,全局的FTP实例会超时,而局部变量就会出现“broken pipe(32)”的错误。解决这个问题的方法很简单,只需要在函数内部把ftp_handle声明为全局变量。

import ftplib
from time import sleep
ftp_handle = ftplib.FTP(host,user,pass)
ftp_handle.encoding = 'utf-8'
def func1():
    global ftp_handle
    ftp_handle = ftplib.FTP(host,user,pass)
    ftp_handle.encoding = 'utf-8'
    ftp_handle.nlst()
    ftp_handle.quit()
while(1):
    now = datetime.now()
    print(now)
    try:
        func1()
    except Exception as e:
        print(e)
    sleep(10)
    

这样做会让函数使用全局范围的变量,这样FTP就不会因为超时而被关闭。可能是个bug,因为局部变量出现错误本来应该和全局变量没有关系。

也许这能解决这个老问题?

1

你好,我不知道为什么会出现这个错误,但当我把我的脚本中的打印信息输出到另一个文件时,这个错误就没出现了,我的脚本也成功运行了。
举个例子:Myscript.py > test.log

撰写回答