2012-11-28 10 views
1

我希望这不会跨越超级用户的领土。如果脚本启动后电缆连接,Python没有获得IP

所以我有一个嵌入式Linux,其中系统进程自然是相当剥离。我不太确定哪个系统进程监视到物理层,并在网络电缆插入时启动DHCP客户端,但我自己做了一个。 ¨ 问题是,如果我有一个Python脚本,使用http连接,运行之前我有一个IP地址,它永远不会得到一个连接。即使我有一个合法的IP,蟒蛇仍具有

那么,怎样才能我得到了Python实现提供新的连接“在名称解析临时错误”,而无需重新启动脚本?

另外,我错过了一些正常的程序,Linux在网络电缆连接正常运行。

我使用的dhcp客户端是udhcpc,python版本是2.6。使用httplib进行连接。

回答

1

它可能是其中一个python模块正在缓存网络状态,因此它没有使用最新的设置。尝试并重新加载所有网络相关模块。这方面的一个简单的例子是:

import sys, socket, urllib 

for i in [sys, socket, urllib]: 
    reload(i) 

如果不工作四顾sys.modules看看还有什么得到了进口,并尝试更多的模块那里。重新加载的更极端的版本将是下面的代码,您可以尝试作为最后的努力。

代码

import sys 
print 'reloading %s modules ' % len(sys.modules) 
for name, module in sys.modules.items(): 
    try: 
     reload(module) 
    except: 
     print 'failed to import %s' % name 

输出

reloading 42 modules 
failed to import __main__ 
failed to import encodings.encodings 
failed to import encodings.codecs 
failed to import lazr 
failed to import encodings.__builtin__ 
+0

试过两种方法,都没有工作。 – Gjordis

+0

@Gjordis这很有趣,对不起,我全都没有想法。请让我们更新发生的事情。如果你解决了这个问题,你可以发表一个自己问题的答案。 –

2

听起来httplib的缓存/etc/resolv.conf您的DHCP客户端获取IP,之后被更新。

您可能会考虑编写一个等待获取IP地址的包装脚本,然后调用您的python脚本。

或者,您可以尝试在您的python脚本中,而不是打开任何套接字连接,直到获取IP地址并更新了/etc/resolv.conf

编辑

httplib的使用socket.create_connection()其中,经过一番搜索,I found does cache/etc/resolv.conf。 (好吧,似乎libc的嵌入式版本实际上是在进行缓存)。

你可以试试SugarLabs' solution,虽然我不能说它的有效性。

+0

resolv.conf可能是问题。目前我正在使用等待IP方法,并在dns-servers更改时重新启动脚本,但我想将此脚本作为线程嵌入到另一个脚本中。等待第一次访问IP地址的地址会在第二次检索时发生,比如网关发生变化,它不再工作。谢谢你在任何情况下捏两个回答者 – Gjordis

+0

谢谢! SugarLabs的解决方案对我来说非常合适,我只需要在套接字连接之前添加以下代码: 'import ctypes try: libc = ctypes.CDLL('libc.so.6') res_init = getattr(libc,'__res_init ') res_init(无) 除外: pass' – Megarushing

0

经过了更多的研究,jedwards提出的glibc问题似乎成了问题。我没有找到解决方案,但为我的用例做了解决方法。 考虑到我只使用一个URL,我添加了自己的“resolv.file”。 当PHY报告电缆连接时,一个小守护程序获取URL的IP地址。这个IP被保存到“我自己的resolv.conf”中。从这个文件中,python脚本检索用于帖子的IP。

不是一个很好的解决方案,而是一个解决方案。

相关问题