Python中没有得到IP,如果脚本后,连接电缆已经开始(Python not getting IP

2019-07-04 05:41发布

我希望这不会越境进入超级用户的领土。

所以,我有一个嵌入式Linux,在系统进程很自然剥离。 我不是哪个系统进程监视器相当肯定物理层,而在网络电缆插入启动DHCP客户端,但我做了一个自己。 ¨问题是,如果我有一个python脚本,使用HTTP连接,运行之前,我有一个IP地址,它永远不会得到一个连接。 即使我有一个合法的IP,蟒蛇仍具有

“在名称解析临时错误”

所以,我怎么能得到实现提供新的连接,而不需要重新启动脚本中的蟒蛇?

另外,我错过了一些正常的程序运行Linux通常在网络电缆连接。

我使用DHCP客户端是使用udhcpc和Python版本是2.6。 使用httplib的用于连接。

Answer 1:

听起来像httplib的缓存/etc/resolv.conf的DHCP客户端获取IP,之后被更新。

你可能会考虑写一个等待,直到获得IP地址的包装脚本,然后调用你的Python脚本。

或者,你可以尝试,你的Python脚本中,直到你已经获得一个IP地址,而不是打开任何套接字连接/etc/resolv.conf更新。

编辑

httplib的使用socket.create_connection()其中,经过一番搜索, 我发现确实缓存 /etc/resolv.conf 。 (嗯,看来libc中的嵌入式版本实际上是在做缓存)。

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



Answer 2:

它可能是蟒蛇模块之一是缓存网络的状态,所以它没有使用最新的设置。 尝试并重新加载所有网络相关的模块。 这方面的一个简单的例子是:

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__


Answer 3:

很多进一步的研究之后,glibc的问题jedwards建议,似乎是这个问题。 我没有找到一个解决方案,但对于我的用例提出的解决方法。 考虑到我只用一个网址,我说我自己的“resolv.file”。 当PHY报告连接的一个小型的守护进程获取URL的IP地址。 该IP被保存到“我自己的resolv.conf”。 从这个文件中的python脚本获取IP使用上岗。

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



文章来源: Python not getting IP if cable connected after script has started