在Python中如何在管道使用期间关闭套接字连接

2024-10-06 12:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这样一个场景中:

  1. 我的脚本打开了到远程数据库的套接字连接
  2. 获取迭代器(通过对远程数据库执行SQL语句返回)
  3. 迭代迭代器并打印值

由于SQL经常返回大量记录,因此我经常以管道方式使用脚本,即python script.py | head -10。当然,当我用管道将其传输到head时,会出现套接字错误。对异常的修复是:

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

我的问题是,对于管道(例如head -5),数据库套接字连接是自动关闭的还是正确关闭的?如果没有,我如何在脚本中关闭它以适应管道的使用

代码结构如下所示:

def getIter(n, conn):
  for i in xrange(n):
    yield i

def p(l):
  for x in l:
    print x

if __name__ == '__main__':
  # dbms_socket_conn.open() 

  # get iterator 
  ii = getIter(100, conn=None)
  p(ii)

  print "is the dbms connection got closed in case of pipe (e.g. head -5) ?"
  # dbms_socket_conn.close()

Tags: in脚本数据库sqlsignal远程管道def
1条回答
网友
1楼 · 发布于 2024-10-06 12:25:57

你可以这样做:

try:
    # dbms_socket_conn.open() 

    # get iterator 
    ii = getIter(100, conn=None)
    p(ii)

    print "is the dbms connection got closed in case of pipe (e.g. head -5) ?"
finally:
    # dbms_socket_conn.close()

以确保代码执行close方法

编辑: “head-5”只显示输出的前5行,但这并不意味着脚本停止。如果您尝试这样做:

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

def getIter(n, conn):
  for i in xrange(n):
    yield i

def p(l):
  for x in l:
    print x

if __name__ == '__main__':
    try:
        ii = getIter(100, conn=None)
        p(ii)
    finally:
        with open("test.txt","w") as f:
            f.write("asdasdasdasd")

您将看到文件被写入,这意味着finally子句被执行。你应该把dbms\u socket\u conn.close()放在那里

相关问题 更多 >