Python没有关闭文件描述符

时间:2013-11-26 14:49:38

标签: python linux

我正在开发一个长期运行的python脚本,它可以连接到不同的串口。该脚本在执行过程中崩溃了几个小时,引用了“打开太多文件”。

我已经跟踪了串口模块的问题,其中.close()方法似乎没有减少python正在使用的文件描述符的数量。我正在使用lsof | grep python | wc进行检查。使用Debian 7.2& Python 2.7.3

以下示例慢慢使用越来越多的文件描述符,直到达到限制为止。为什么这样,我怎么能避免呢?

#!/usr/bin/env python
import serial                   #Used to communicate with pressure controller
import logging
import time
from time import gmtime, strftime
logging.basicConfig(filename="open_files_test.log")

# Write unusual + significant events to logfile + stdout
def log( message ):
    time = strftime("%Y-%m-%d %H:%M:%S", gmtime())
    logging.warning( time + " " + message )
    print( message )

for i in range(2000):
    for n in range(1, 12):
        try:
            port_name = "/dev/tty" + str(n+20)
            com = serial.Serial(port_name,9600,serial.EIGHTBITS,serial.PARITY_NONE,serial.STOPBITS_ONE,0.0,False,False,5.0,False,None)
            com.open()
            com.flushInput()
            com.flushOutput()
            log("Opened port: " + port_name)
        except serial.SerialException:
            com = None
            log("could not open serial port: " + port_name)

        com.close()
        log("Closed port: " + port_name)
        time.sleep(1)

log("Finished Program")

由于

2 个答案:

答案 0 :(得分:5)

似乎额外的com.open导致了这个问题。根据{{​​3}} serial.Serial将其打开,因此您无需再次打开它。在Linux中(据我所知,所有POSIX都是)open只是增加计数器并关闭只是减少它。这里有一个删除的答案@wheaties建议使用with我也会推荐:

with serial.Serial(port_name, 9600, ...) as com:
    com.flushInput()
    com.flushOutput()
    ...

答案 1 :(得分:1)

使用finally确保端口已关闭。

try:
    ...
except serial.SerialException:
    ...
finally:
    com.close()