Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:网络服务启动前的网络调用_Python - Fatal编程技术网

Python:网络服务启动前的网络调用

Python:网络服务启动前的网络调用,python,Python,我有一个在启动时启动的脚本,它可能会在网络完全启动之前启动 如果在联网之前运行以下代码,则会失败;如果稍后再次调用,则会成功 即使我将尝试次数增加到5分钟,它仍将继续,直到5分钟,然后返回false,即使在脚本启动后不到30秒,网络可能会启动 在进行任何尝试之前,有没有一种方法可以让下面的代码正常工作,并且在以太网未启动时不会死掉 self.TRIES = 60 self.URL="http://www.somedomain.com" ## Do we have internet def is

我有一个在启动时启动的脚本,它可能会在网络完全启动之前启动

如果在联网之前运行以下代码,则会失败;如果稍后再次调用,则会成功

即使我将尝试次数增加到5分钟,它仍将继续,直到5分钟,然后返回false,即使在脚本启动后不到30秒,网络可能会启动

在进行任何尝试之前,有没有一种方法可以让下面的代码正常工作,并且在以太网未启动时不会死掉

self.TRIES = 60
self.URL="http://www.somedomain.com"

## Do we have internet
def isup():
  try:
    urllib2.urlopen(self.URL).close()
    return True
  except urllib2.URLError,e:
    pass
  return False

## Try the lookup
while (self.TRIES > 0):
  if isup():
    check()
    break
  self.TRIES = self.TRIES-1
  time.sleep(1)
编辑 在OS引导(Arch Linux)期间,适配器(本例中为eth0)和网络服务最初未运行,并在引导过程中启动

如果在网络服务完全启动之前调用urllib2(以及其他与网络相关的调用),则urllib2(以及其他与网络相关的调用)可能会死亡,后续调用将始终导致失败

这与断开以太网电缆的连接不同,如果您只是拔下以太网电缆并调用函数(类),那么它将成功,但如果在网络服务完全启动之前调用它,它将失败并死亡

我可以通过在代码顶部添加一个time.sleep(30)来解决这个问题,这样就有足够的时间让O/S网络服务完全启动,脚本可以100%按预期工作。

您可以按以下方式执行:

def isup():
  try:
    urllib2.urlopen(self.URL).close()
    return True
  except urllib2.URLError,e:
    pass
  return False

## Try the lookup
while not isup():
    pass           #or replace pass with time.sleep(1) or time.sleep(0.5)
check()

为什么不使用
ping

def isUp():
    ret = os.system("ping -c 1 www.google.com")
    return (ret != 0)

注意:这在Windows上不起作用,但您想到了…

使用请求并检查状态代码

import requests
In [36]: r = requests.get('http://httpbin.org/get')

In [37]: r.status_code == requests.codes.ok
Out[37]: True

In [38]: r.status_code
Out[38]: 200

200
In [33]:  r = requests.get('http://httpbin.org/bad')

In [34]: r.status_code
Out[34]: 404

In [35]: r.status_code == requests.codes.ok
Out[35]: False

def isup():
    try:
        r = requests.get(self.URL)
        return r.status_code == requests.codes.ok
    except Exception, e:
        print e
        return False

谢谢,但如果我这样做,它将永远持续下去,这不是因为我的等待时间太短,而是如果在网络未启动时调用urllib2,urllib2似乎会死掉!你能不能不检查一下状态码?你说的在联网之前是什么意思?你在做什么操作系统?我还想知道你所说的“在网络建立之前”是什么意思。我刚刚在我的机器上测试了断开网络连接,运行了一行失败的
urllib2.urlopen()http://www.yahoo.com)。关闭()
,然后重新连接并重试。它工作得很好。您是否进行过测试以确保它确实正确地提取了数据?仅仅因为你有网络连接并不意味着你有一个工作的DNS,有效的出站端口。。。如前所述,我也测试了这个代码片段,在我的例子中效果很好。另一种完全不同的方法是设置init脚本,这样在设置网络后,这里肯定会调用这个脚本。