Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python smtplib模块泄漏内存_Python_Smtplib - Fatal编程技术网

Python smtplib模块泄漏内存

Python smtplib模块泄漏内存,python,smtplib,Python,Smtplib,我编写了一个守护进程来监视目录中的文件,并在任何文件发生更改时发送电子邮件。我使用bb freeze将其编译为Windows.exe。在让它运行了几天后,我注意到它占用了越来越多的内存空间 我曾经监视.py文件(而不是编译的.exe)中的内存使用情况,发现每次调用函数时,对象的数量都增加了3个,相应的内存使用量增加了484字节。它使用smtplib模块,我无法理解泄漏发生在哪里 from guppy import hpy import time import gc import os impo

我编写了一个守护进程来监视目录中的文件,并在任何文件发生更改时发送电子邮件。我使用bb freeze将其编译为Windows.exe。在让它运行了几天后,我注意到它占用了越来越多的内存空间

我曾经监视.py文件(而不是编译的.exe)中的内存使用情况,发现每次调用函数时,对象的数量都增加了3个,相应的内存使用量增加了484字节。它使用smtplib模块,我无法理解泄漏发生在哪里

from guppy import hpy
import time
import gc

import os
import smtplib
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEAudio import MIMEAudio
from email.MIMEImage import MIMEImage
from email.Encoders import encode_base64

def sendMail(subject, text, to='blah@gmail.com', username='more.blah@gmail.com', password='blah', smtpServer='smtp.gmail.com', smtpPort=587):
   gmailUser = username
   gmailPass = password
   recipient = to

   msg = MIMEMultipart()
   msg['From'] = gmailUser
   msg['To'] = recipient
   msg['Subject'] = subject
   msg.attach(MIMEText(text))

   mailServer = smtplib.SMTP(smtpServer, smtpPort)
   mailServer.ehlo()
   mailServer.starttls()
   mailServer.ehlo()
   mailServer.login(gmailUser, gmailPass)
   mailServer.sendmail(gmailUser, recipient, msg.as_string())
   mailServer.quit()

   print('Sent email to "%s"' % recipient)

if __name__=='__main__':
   while True:
      sendMail("Function", "Blah!")
      gc.collect()
      print hpy().heap()
      time.sleep(10)
我只是在互联网上的某个地方看到了这段代码并复制了它。它可以工作,但会泄漏内存。 有人能帮我找出内存泄漏发生在哪里吗??:(

编辑:似乎使用msg。as_string()是导致内存泄漏的原因。使用msg=“Blah”等纯文本代替msg。as_string()可以解决问题。但这不允许我添加主题行。

您有权访问吗?这是查找内存泄漏的一个很好的工具。您还可以尝试使用

编辑:

抱歉,刚才注意到您说您在Windows上,valgrind不适用于:(

无论如何,您可能希望查看Python for Windows用于加密的任何库。在我的Mac电脑上,您提供的脚本显示
mailServer.starttls()
调用周围存在内存泄漏,而罪魁祸首似乎是libssl/libcrypto周围的Python包装。如果没有任何帮助(非Windows…),很抱歉.

您有权访问吗?这是查找内存泄漏的一个很好的工具。您也可以尝试使用

编辑:

抱歉,刚才注意到您说您在Windows上,valgrind不适用于:(


无论如何,您可能希望查看Python for Windows用于加密的任何库。在我的Mac电脑上,您提供的脚本显示
mailServer.starttls()
调用周围存在内存泄漏,而罪魁祸首似乎是libssl/libcrypto周围的Python包装。如果没有任何帮助(非Windows…),很抱歉.

我敢打赌你有一个参考周期

编辑:我将您的代码稍微修改为:

import time
import gc
import smtplib
import mimetypes
from email.MIMEText import MIMEText

def sendMail(subject, text):
   gmailUser = 'myemail@gmail.com'
   gmailPass = 'mypassword'
   recipient = gmailUser

   msg = MIMEMultipart()
   msg['From'] = gmailUser
   msg['To'] = recipient
   msg['Subject'] = subject
   msg.attach(MIMEText(text))

   mailServer = smtplib.SMTP('smtp.gmail.com', 587)
   mailServer.starttls()
   mailServer.login(gmailUser, gmailPass)
   mailServer.sendmail(gmailUser, recipient, msg.as_string())
   mailServer.quit()

   print('Sent email to "%s"' % recipient)

if __name__=='__main__':
   gc.set_debug(gc.DEBUG_LEAK)
   for item in range(1000):
      sendMail("Function", "Blah!")
      gc.collect()
      time.sleep(2)

Guppy不适用于Python和C++编译器的版本,所以我不能测试输出(也许它对你也不起作用)。我可以告诉您的是,我在process explorer中查看了垃圾收集输出和一些内存统计信息,没有发现代码中存在重大差异或泄漏问题。关键更改:删除了对SMTP.ehlo()的调用(不必要),删除了默认函数参数(我怀疑只要函数在作用域内,这些对象就可能作为对象存在,只要函数在作用域内,这些对象就可以被引用,这可能会以某种方式保留SMTP对象)。因此,您可能希望尝试一种方法,然后再尝试另一种方法,看看哪种方法可以解决您的问题


查看帮助和一些工具。

我敢打赌您有一个参考周期

编辑:我将您的代码稍微修改为:

import time
import gc
import smtplib
import mimetypes
from email.MIMEText import MIMEText

def sendMail(subject, text):
   gmailUser = 'myemail@gmail.com'
   gmailPass = 'mypassword'
   recipient = gmailUser

   msg = MIMEMultipart()
   msg['From'] = gmailUser
   msg['To'] = recipient
   msg['Subject'] = subject
   msg.attach(MIMEText(text))

   mailServer = smtplib.SMTP('smtp.gmail.com', 587)
   mailServer.starttls()
   mailServer.login(gmailUser, gmailPass)
   mailServer.sendmail(gmailUser, recipient, msg.as_string())
   mailServer.quit()

   print('Sent email to "%s"' % recipient)

if __name__=='__main__':
   gc.set_debug(gc.DEBUG_LEAK)
   for item in range(1000):
      sendMail("Function", "Blah!")
      gc.collect()
      time.sleep(2)

Guppy不适用于Python和C++编译器的版本,所以我不能测试输出(也许它对你也不起作用)。我可以告诉您的是,我在process explorer中查看了垃圾收集输出和一些内存统计信息,没有发现代码中存在重大差异或泄漏问题。关键更改:删除了对SMTP.ehlo()的调用(不必要),删除了默认函数参数(我怀疑只要函数在作用域内,这些对象就可能作为对象存在,只要函数在作用域内,这些对象就可以被引用,这可能会以某种方式保留SMTP对象)。因此,您可能希望尝试一种方法,然后再尝试另一种方法,看看哪种方法可以解决您的问题

查看帮助和一些工具。

1)您可以尝试使用简单的字符串文本作为消息执行相同的代码。
2) 您可以删除对ehlo的调用,并查看是否由此修复了内存泄漏。(它们是不必要的)

1) 您可以尝试使用简单的字符串文本作为消息执行相同的代码。
2) 您可以删除对ehlo的调用,并查看是否由此修复了内存泄漏。(它们是不必要的)


你应该在此处添加答案作为答案并接受,而不是编辑你的帖子。或者,如果此处的其他答案中有一个最终准确反映了答案,你应该接受它。:)你应该在此处添加答案作为答案并接受它,而不是编辑你的帖子。或者,如果此处的另一个答案最终准确反映了答案,您应该接受它。:)