如果在脚本启​​动后连接了电缆,则Python无法获取IP

时间:2012-11-28 13:47:53

标签: python networking httplib

我希望这不会进入超级用户区域。

所以我有一个嵌入式Linux,系统进程自然会被剥离。我不太确定哪个系统进程监视物理层并在插入网络电缆时启动dhcp客户端,但我自己制作了一个。 ¨ 问题是,如果我有一个python脚本,使用http连接,在我拥有IP地址之前运行,它将永远不会得到连接。即使我有一个有效的IP,python仍然有

“名称解析中的暂时错误”

那么如何在不重新启动脚本的情况下让python实现新连接?

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

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

3 个答案:

答案 0 :(得分: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,虽然我不能说它的有效性。

答案 1 :(得分: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__

答案 2 :(得分:0)

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

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