1

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

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

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

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

或者,我是否缺少一些正常程序 Linux 在网络电缆连接时正常运行。

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

4

3 回答 3

2

听起来像是/etc/resolv.conf在您的 DHCP 客户端获得 IP 后更新的 httplib 缓存。

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

或者,您可以尝试在您的 python 脚本中,在您获得 IP 地址并更新之前不要打开任何套接字连接。/etc/resolv.conf

编辑

httplib 使用socket.create_connection()它,经过一番搜索,我发现确实cache /etc/resolv.conf。(好吧,似乎 libc 的嵌入式版本实际上是在做缓存)。

你可以试试SugarLabs 的解决方案,虽然我不能说它的有效性。

于 2012-11-28T14:13:45.880 回答
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__
于 2012-11-28T13:56:22.083 回答
0

经过大量研究,jedwards 建议的 glibc 问题似乎是问题所在。我没有找到解决方案,但为我的用例做了解决方法。考虑到我只使用一个 URL,我添加了自己的 "resolv.file" 。当 PHY 报告电缆已连接时,一个小型守护程序会获取 URL 的 IP 地址。此 IP 保存到“我自己的 resolv.conf”。从这个文件中,python 脚本检索 IP 以用于发布。

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

于 2012-11-30T10:16:20.383 回答