【问题标题】:is python subprocess module quirky?python子进程模块古怪吗?
【发布时间】:2012-10-25 06:32:22
【问题描述】:

今天早些时候,这段代码按我的意愿工作。现在没有了。我希望它运行 airodump 并将输出存储到 csv 文件(命令行选项)。几秒钟后终止该进程。

def find_networks():
airodump = subprocess.Popen(["airodump-ng","-w","airo","--output-format","csv","mon0"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)  
time.sleep(10)
try:
    os.kill(airodump.pid, signal.SIGTERM)
    if not airodump.poll():
        print "shouldn't have had to do this.."
    airodump.kill()
    if not airodump.poll():
        print "shouldn't have had to do this....."
    airodump.terminate()
    if not airodump.poll():
        print "shouldn't have had to do this........"
except OSError:
    print "?"
    pass
except UnboundLocalError:
    print "??"
    pass        
return_code = airodump.wait()
print return_code

(这里的输出是: 不应该这样做.. 不应该这样做...... -9)

之前它会完全按照我说的做(相同的代码)。负数 9 令人担忧,早些时候我得到 1,但进程仍然死掉,这很重要,但不是因为 os.kill 语句,这很奇怪。不过这不是大问题。我只需要那个 .csv 文件。有了这个实现,csv 文件完全是空的——它被制作了,但没有任何东西放入其中。如果我在没有将标准输出设置为 PIPE 的情况下运行子进程,则会创建并填充 csv 文件,但我不能那样做——我必须将标准输出保持在屏幕之外。

stdout=subprocess.PIPE 是否导致数据被“写入”到 PIPE-land 中不存在的 csv 文件???

【问题讨论】:

  • 在我看来 airodump.kill()airodump.terminate() 应该交换。 kill 发送 SIGKILL,无条件的进程终止,而 SIGTERM 只是要求进程退出。

标签: python linux subprocess


【解决方案1】:

很难用您的示例代码重现您的机器上发生的事情。但是可能会导致一些问题的一件事:如果您实际上打算从管道中读取,则应该只使用stdout=subprocess.PIPE。如果你不这样做,一旦它产生足够的输出来填满管道缓冲区,进程就会阻塞。

如果您只想隐藏标准输出和标准错误,您可以这样做:

airodump = subprocess.Popen(..., stdout=open("/dev/null", "w"), stderr=open("/dev/null", "w"))

或者更好:

import os
airodump = subprocess.Popen(..., stdout=open(os.devnull, "w"), stderr=open(os.devnull, "w"))

或者,如果您使用的是 Python 3,则可以使用 subprocess.DEVNULL

【讨论】:

  • 这就是我想要的。是的,没有充分的理由将它发送到管道,我只是试图让它远离屏幕。所以我需要它做的一切,谢谢。不过,另一件事。脚本完成后,我输入的任何内容都不会出现在屏幕上(我想是 /dev/null)。我仍然可以运行命令,并且显示了这些命令的输出,只是我输入的文本不会出现?
  • 你是如何运行你的脚本的?从命令行、IDE 还是双击图标?您可能想创建另一个 SO 问题,因为答案可能并不简单。
【解决方案2】:

由于您将输出发送到 PIPE,如果需要,您应该明确将其读出,然后可以将其写入本地文件。某样东西:

airodump = subprocess.Popen(["airodump-ng","-w","airo","--output-format","csv","mon0"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
... # wait the command to complete
open("the_file_you_want_to_store_output", "w").write(airodump.stdout.read())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2011-03-09
    相关资源
    最近更新 更多