0

我的子流程代码有问题。工作正常,subprocess.Popen()但是当我尝试通过它读取它的输出时stdout.read(),没有值可以读取。

**import os
import signal
import subprocess
import threading
import sys
import commands

print commands.getoutput("hcitool dev")
print 'down'
commands.getoutput('hciconfig hci1 down')
print 'up'
commands.getoutput('hciconfig hci1 up')
commands.getoutput('killall hcitool')
stop = False
ping = subprocess.call('hcitool lescan', shell = False,
stdout=subprocess.PIPE,executable='/bin/bash')
for i in ping.stdout:
    print i

def kill():
    global stop
    stop = True
    os.kill(ping.pid, signal.SIGTERM)

threading.Timer(5, kill).start()

#while not stop:
#   print 'now in while not loop'
#   sys.stdout.write(ping.stdout.read(1))

print 'trying to print stdout'
out, err = ping.communicate()
print "out",out

#result = out.decode()

print "Result : ",result**

当我更改为 ping www.google.com 并产生输出时,此代码工作正常hcitool lescan,但是当我尝试使用它时,hcitool lescan它要么永远挂起,要么不产生输出。帮助表示赞赏!

4

4 回答 4

5

以上任何答案都对我不起作用。一直挂在 hcitool 的扫描中。所以最后我写了一个shell脚本并用我的python代码调用它。这对我来说很好,我正在读取文件“result.txt”的输出。

hcitool lescan>result.txt &  
sleep 5  
pkill --signal SIGINT hcitool
于 2014-11-07T06:20:53.747 回答
0

非常感谢..但问题是 hcitool lescan 永远不会停止,因此挂在代码的下一行。我在这里找到了类似的解决方案。这很好,我不必杀死子进程,这个代码需要一些额外的时间来输出输出,但是下面的代码可以很好地工作,

from os import kill
import signal
import subprocess
import threading
import tempfile
import sys
import time
from tempfile import TemporaryFile
import commands
t = TemporaryFile()
global pipe_output
print commands.getoutput("hcitool dev")
print 'down'
commands.getoutput('hciconfig hci0 down')
print 'up'
commands.getoutput('hciconfig hci0 up')
print commands.getoutput("hcitool dev")
commands.getoutput('killall hcitool')
p = subprocess.Popen('hcitool lescan', bufsize = 0,shell = True, stdout =subprocess.PIPE,stderr = subprocess.STDOUT)
time.sleep(10)
#os.kill(p.pid,signal.SIGTERM)
for i in range(0,30,1):
    print 'for'
    inchar = p.stdout.readline()
    i+=1
    if inchar:
        print 'loop num:',i
        print str(inchar)
        t.write(str(inchar))
print 'out of loop'
t.seek(0)
print t.read()

任何帮助如何减少等待时间,除了改变 time.sleep() ,感谢大家

于 2013-09-05T10:39:36.367 回答
0

您的代码中有多个错误,例如,subprocess.call()返回一个整数(程序的退出状态)并且一个整数没有.stdout属性;shell=False和 non-None的组合也executable很少有用(在这种情况下可能使用不正确)。

修复代码的最简单方法是使用check_output()

from subprocess import check_output as qx

output = qx(["hcitool", "lescan"]) # get all output at once
print output,

作为替代方案,您可以在程序的标准输出被刷新后逐行打印程序的输出:

from subprocess import Popen, PIPE

proc = Popen(["hcitool", "lescan"], stdout=PIPE, bufsize=1) # start process
for line in iter(proc.stdout.readline, b''): # read output line-by-line
    print line,
# reached EOF, nothing more to read
proc.communicate() # close `proc.stdout`, wait for child process to terminate
print "Exit status", proc.returncode

要杀死一个子进程,您可以使用它的.kill()方法,例如:

from threading import Timer

def kill(process):
    try:
        process.kill()
        process.wait() # to avoid zombies
    except OSError: # ignore errors
        pass 

Timer(5, kill, [proc]).start() # kill in 5 seconds
于 2013-09-04T14:42:22.990 回答
0

使用 Popen 类而不是调用类。hcitool lescan 将永远运行。subprocess.call 等待调用完成返回。Popen 不等待。

于 2015-08-02T23:09:17.207 回答