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