【发布时间】:2013-09-27 20:12:00
【问题描述】:
我想做类似于这里的第二个答案的事情(但不太相似):Simulate Ctrl-C keyboard interrupt in Python while working in Linux
它更简单,我想我只是错过了一些东西。比如说,从 python 脚本中,我只想调用 'ping' 并在第 10 次之后终止它。我正在尝试像上面的链接那样做:
p = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE)
for line in p.stdout:
print line
if re.search('10', line):
break
os.kill(p.pid, signal.SIGINT)
但它不起作用。
我还希望显示“ping”的常规输出。我该怎么做呢?
编辑:这实际上不是我想做的“ping”。我只是将它用作具有连续输出的命令的示例,我想及时终止它。
更具体地说,我正在运行旧版本的 BitTorrent(第 3 个答案中的 v5.0.9:Where to find BitTorrent source code?),我通过 python 脚本调用它。 bittorrent-console.py 是一个简单的终端版本,因此是“控制台”。它定期输出多行。比如:
saving: filename
file size: blah
percent done: 100.0
blah: blahblah
我实际上是这样称呼它的:
subprocess.call(['./bittorrent-console.py', 'something.torrent'])
当我看到 'percent done:' 为 100.0 时,我想自动终止它。
编辑:我在 CentOS、Python 2.6 上运行。
【问题讨论】:
-
还要注意
10可能是IP地址的一部分 -
是的,我意识到了这一点,但假设地址或时间中没有 10。但同样,这只是一个例子。可能是
if re.search('icmp_seq=10'。 -
请注意,
subprocess.Popen和subprocess.call在一个非常重要的细节上有所不同。前者是异步的,后者是同步的。在后一种情况下,当您调用os.kill()时,应用程序已经死了,os.kill()没有任何作用。 -
啊。是的。确实如此。不过,我想继续使用
call,因为当我尝试下面的答案时,输出没有滞后。它只是调用了 bittorrent-console 并让它运行。下载完成后我不知道如何终止它,除了键盘中断。 -
您是否知道在脚本内部,
call之后,是否有一种方法可以获取我刚刚调用的进程 ID?