Python脚本中的[Errno 32]Broken pipe错误在Crontab中
我在运行一个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