我希望这不会进入超级用户的领域。
所以我有一个嵌入式 linux,其中系统进程自然是相当精简的。我不太确定哪个系统进程监控到物理层并在插入网线时启动 dhcp 客户端,但我自己做了一个。¨问题是,如果我有一个使用 http 连接的 python 脚本,在我有 IP 地址之前运行,它将永远不会获得连接。即使我有一个有效的IP,python仍然有
"名称解析中的临时错误"
那么如何让 python 在不重新启动脚本的情况下实现可用的新连接呢?
或者,我是否缺少一些正常的程序Linux在网线连接时正常运行。
我使用的dhcp客户端是udhcp,python版本是2.6。使用 httplib 进行连接。
听起来像 httplib 缓存/etc/resolv.conf
在您的 DHCP 客户端获取 IP 后更新。
您可以考虑编写一个包装脚本,该脚本等到获取 IP 地址,然后调用您的 python 脚本。
或者,您可以尝试在 python 脚本中打开任何套接字连接,直到您获得 IP 地址并/etc/resolv.conf
更新。
编辑
httplib 使用socket.create_connection()
,经过一些搜索,我发现它确实缓存/etc/resolv.conf
。 (好吧,似乎libc的嵌入式版本实际上是在执行缓存)。
你可以试试SugarLabs的解决方案,尽管我不能说它的有效性。
其中一个 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__
经过更多的研究,jedwards提出的glibc问题似乎是问题所在。我没有找到解决方案,但为我的用例制定了解决方法。考虑到我只使用一个URL,我添加了自己的"resolv.file"。当 PHY 报告电缆连接时,小型守护程序获取 URL 的 IP 地址。此IP被保存到"我自己的resolv.conf"中。从此文件中,python脚本检索用于帖子的IP。
不是一个好的解决方案,而是一个解决方案。