2015-12-08 174 views
0

我试图创建一个小应用程序,当您长时间失去连接并播放另一个连接时建立连接播放声音。用于无线连接。if语句子流程python不工作

我还是新来的Python :)尝试一些小项目来提高我的知识。如果你确实回答了,我会非常感谢你能否包含任何有关如何使用子进程的信息。

我已经定义了子进程,但我不知道如何将我的if语句加上字,以便从一个函数循环到另一个函数。 IE功能1 =中频ping损失> 15 ping播放声音并继续播放功能2 ...如果功能2 ping成功> 15 ping播放声音并返回到功能1.继续。

我还没有将程序包装在一个循环中,在这一点上,我只是试图让ping与if语句一起工作。

所以现在应用程序只是不断循环ping。

import os 
import subprocess 
import winsound 
import time 

def NetFail(): 
    winsound.Beep(2000 , 180), winsound.Beep(1400 , 180) 

def NetSucc(): 
    winsound.Beep(1400 , 250), winsound.Beep(2000 , 250),  

ips=[] 
n = 1 
NetSuccess = 10 
NetFailure = 10 
PinSuc = 0 
PinFail = 0 
x = '8.8.8.8' 

ips.append(x) 
for ping in range(0,n): 
ipd=ips[ping] 

def PingFailure(): 
    while PinFail < NetSuccess: 
     res = subprocess.call(['ping', '-n', '10', ipd]) 
    if ipd in str(res): 
     PingSuccess() 
    else: 
     print ("ping to", ipd, "failed!"), NetFail() 

def PingSuccess(): 
    while PinFail < NetFailure: # This needs to be cleaned up so it doesn't interfere with the other function 
     res = subprocess.call(['ping', '-n', '10', ipd]) 
    if ipd in str(res): 
     PingFail() 
    else: 
     print ("ping to", ipd, "successful!"), NetSucc() 
+0

你想这是在Linux上运行(或其他类Unix)系统,还是在Windows上?不幸的是,'ping'命令的功能不一样... –

+0

这将在Windows机器上运行。 –

回答

0

不太清楚,你想实现什么,但你的if语句是while循环的一部分,如果你希望它是执行每次的ping通过子被称为被调用。

另外: 这里是子文档:你必须通过subprocess.call_output叫它https://docs.python.org/3/library/subprocess.html 对于观看过程的输出:

ls_output = subprocess.check_output(['ls']) 

欲了解更多信息,看看这个:http://sharats.me/the-ever-useful-and-neat-subprocess-module.html#a-simple-usage

+0

+1谢谢。因此,该程序将ping通8.8.8.8,并且如果ping连续失败15次。它会播放声音并移动到第二个功能,它将连续查找15次scucessful ping,然后播放声音并返回到第一个功能。有效监控连接。 如果成功将+1添加到计数器,并且如果失败,则将计数器重置为0,因此它会连续15次失败或成功ping。 –

+0

我会做出一些更改,并让您知道我发布的第二条链接是否有帮助。 –

+0

看起来你想用while循环来计数。你可以为for循环使用for循环(而且目前它根本不起作用,因为你正在比较两个静态值作为while的条件)。 –

1

当您使用命令ping -n 10 ip时,我假设您使用的是Windows系统,就像在Linux(或其他类Unix)上那样,它会是ping -c 10 ip

不幸的是,在Windows上,ping总是返回0,因此无法使用返回值来知道是否已达到peer。即使输出不是很清楚......

所以你应该:

  • cmd运行控制台命令ping -n 1 ip与可访问和无法访问的IP,注意输出和不同之处。在我的(法国)系统,它写入不可能,我想你应该得到无法或您所在区域的等效
  • 开始从Python中pingsubprocess.Popen输出重定向到一个管道
  • 得到的输出(和错误输出)与communicate
  • 在输出中搜索Unable字。

代码可以像:

errWord = 'Unable' # replace with what your locale defines... 
p = subprocess.Popen([ 'ping', '-n', '1', ipd], 
      stdout = subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = p.communicate() 
if errWord in out: 
    # process network disconnected 
else: 
    # process network connected 

或者,你可以搜索pypi一个纯粹的Python实现平如PY平...

无论如何,我不会在触发器中使用两个函数,因为如果您以后想要测试与多个IP的连接性会更困难。我宁愿使用一个类

class IP(object): 
    UNABLE = "Unable" # word indicating unreachable host 
    MAX = 15   # number of success/failure to record new state 
    def __init__(self, ip, failfunc, succfunc, initial = True): 
     self.ip = ip 
     self.failfunc = failfunc # to warn of a disconnection 
     self.succfunc = succfunc # to warn of a connection 
     self.connected = initial # start by default in connected state 
     self.curr = 0    # number of successive alternate states 
    def test(self): 
     p = subprocess.Popen([ 'ping', '-n', '1', self.ip], 
        stdout = subprocess.PIPE, stderr=subprocess.PIPE) 
     out, err = p.communicate() 
     if self.UNABLE in out: 
      if self.connected: 
       self.curr += 1 
      else: 
       self.curr = 0 # reset count 
     else: 
      if not self.connected: 
       self.curr += 1 
      else: 
       self.curr = 0 # reset count 
     if self.curr >= self.MAX:  # state has changed 
      self.connected = not self.connected 
      self.curr = 0 
      if self.connected:  # warn for new state 
       self.succfunc(self) 
      else: 
       self.failfunc(self) 

然后你可以遍历IP对象的列表,一边喊ip.test(),你会被警告的状态改变

+0

“不幸的是,在Windows上,ping通常返回0,所以你不能使用返回值来知道peer是否已经到达,甚至输出也不是很清楚......”这就解释了为什么它永远不会进入if语句。 我会尽量在几个小时内了解你的代码。 –