波本说。communicate()关闭所有父端文件描述符?

你好,
我是Python的崭新,但是一位经验丰富的C/UNIX程序员。我正在用Python重写一些旧的外壳脚本,这些脚本有很多事情
设置输出=`猫这个| grep |不管...``
我的感觉是应该使用subprocess.popen()来完成这项工作。
我发现了许多示例显示了如何做到这一点,包括道格·海尔曼(Doug Hellmann)网站上的一个非常合适的示例,该网站显示了如何将一堆Popen()S链接在一起,以模仿上面显示的管道示例。但是,我有三个问题:
(1)popen.communicate()是否关闭由Popen()呼叫打开的所有父端文件描述符?我将孩子的stdout连接到父母,例如
comm = subprocess.popen(args,stdout = subprocess.pipe)
这是在循环运行数千次的情况下完成的,因此我需要确保在父母中打开的每个文件描述符以与孩子通信后立即关闭。
(2)如果我不使用popen.communicate()(或者如果不关闭文件描述符),则确切地说是我需要关闭哪个文件描述符以及如何?我假设我唯一需要关闭的内容是我在popen()呼叫中指定=管道的任何stdio流。对于上面的示例,我会做
comm.stdout.close()
不用担心吗?
(3)popen.returncode上的文档有点模糊。这仅仅是孩子的退出代码,还是在OS.Wait()中更充分记录的退出代码和信号状态的组合?
谢谢!

# 回答1


Python的文件手柄关闭次要。我在使用类__DEL__方法关闭文件时遇到了相同的问题。 Python关闭Python对象,文件指针/句柄不是Python对象,因此它收集了垃圾,但何时不一定是知道的。我会说使用相当于
`猫这个| grep |不管...``
而不是调用bash壳。

选择 | 换行 | 行号
  1. for fname in os.listdir(path_name):
  2.     fp = open(os.path.join(path_name, fname)):
  3.     for rec in fp:
  4.         if search_string in rec:
  5.             print rec
  6.     fp.close() 
# 回答2


感谢您的答复,Dwblas。实际上,我提供了一个糟糕的例子(``cat this | grep that | whitch''),在许多情况下,我需要与外部程序进行交流以做​​Python无法在内部做的事情。
我在Comp.lang.python上从Chris Torek那里收到了一个非常全面的答案,他显然在响应之前研究了子过程代码。据他说,这些父侧管文件描述符被popen.communate()明确关闭。如果未使用该例程(我有几个),那么Popen()的删除方法将在垃圾收集器调用时将其关闭。这似乎是由我自己的测试所证实的,尽管由于GC不可靠,我认为我会明确称呼Popen.stdxxx.close(),每当我用父侧的管道上完成管道时。
谢谢!
# 回答3


只是想让你一个 商品 pexpect

标签: python

添加新评论