如果在脚本启动后连接电缆,Python 无法获得 IP



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

所以我有一个嵌入式 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。

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

最新更新