子进程的if语句python不工作

2024-04-19 02:37:43 发布

您现在位置: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()

Tags: 函数inimport功能声音ifdefres
2条回答

不太确定您想要实现什么,但是如果您希望每次通过subprocess调用ping时都执行if语句,那么if语句必须是while循环的一部分。在

同时: 以下是子流程的文档:https://docs.python.org/3/library/subprocess.html 要查看进程的输出,必须通过subprocess.call_输出公司名称:

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

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

当您使用命令ping -n 10 ip时,我假设您使用的是Windows系统,在Linux(或其他类似于Unix)上,它将是ping -c 10 ip。在

不幸的是,在Windows上ping总是返回0,因此您无法使用返回值来知道是否已到达对等方。甚至输出也不是很清楚。。。在

所以你应该:

  • cmd控制台中运行命令ping -n 1 ip,使用可访问和不可访问的ip,记录输出并确定差异。在我的(法语)系统中,它写着Impossible,我想您应该在您的语言环境中得到Unable或等效的
  • 从Python启动ping,并将输出重定向到管道
  • 使用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中搜索ping的纯Python实现,比如pyping。。。在

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

^{pr2}$

然后,您可以迭代IP对象列表,反复调用ip.test(),您将收到状态更改的警告

相关问题 更多 >