我希望这不会进入超级用户区域。
所以我有一个嵌入式Linux,系统进程自然会被剥离。我不太确定哪个系统进程监视物理层并在插入网络电缆时启动dhcp客户端,但我自己制作了一个。 ¨ 问题是,如果我有一个python脚本,使用http连接,在我拥有IP地址之前运行,它将永远不会得到连接。即使我有一个有效的IP,python仍然有
“名称解析中的暂时错误”
那么如何在不重新启动脚本的情况下让python实现新连接?
或者,我错过了一些正常的程序Linux在网络电缆连接时正常运行。
我使用的dhcp客户端是udhcpc,python版本是2.6。使用httplib进行连接。
答案 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。
不是一个好的解决方案,而是一个解决方案。