2015-12-08 113 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語句。 我會盡量在幾個小時內瞭解你的代碼。 –