1

これがスーパーユーザーの領域に入らないことを願っています。

だから私は組み込みの Linux を持っています。そこでは、システム プロセスは当然かなり取り除かれています。どのシステム プロセスが物理層を監視し、ネットワーク ケーブルが接続されたときに dhcp クライアントを起動するかはよくわかりませんが、自分で作成しました。¨ 問題は、IP アドレスを取得する前に http 接続を使用する Python スクリプトを実行すると、接続が確立されないことです。有効なIPを取得した後でも、Pythonにはまだ

「名前解決で一時的なエラーが発生しました」

では、スクリプトを再起動せずに、利用可能な新しい接続を Python に認識させるにはどうすればよいでしょうか。

または、通常の手順を欠いているのでしょうか Linux は、ネットワーク ケーブルの接続時に正常に実行されます。

私が使用している dhcp クライアントは udhcpc で、python のバージョンは 2.6 です。接続には httplib を使用します。

4

3 に答える 3

2

/etc/resolv.confDHCP クライアントが IP を取得した後に更新されるhttplib キャッシュのように聞こえます。

IP アドレスが取得されるまで待機してから、Python スクリプトを呼び出すラッパー スクリプトを作成することを検討してください。

または、Python スクリプト内で、IP アドレスを取得して更新するまでソケット接続を開かないようにすることもできます。/etc/resolv.conf

編集

httplib はsocket.create_connection()これを使用しており、検索した結果、キャッシュを使用ていることがわかりまし /etc/resolv.confた。(まあ、libc の組み込みバージョンが実際にキャッシングを行っているようです)。

SugarLabs のソリューションを試すこともできますが、その有効性については言えません。

于 2012-11-28T14:13:45.880 に答える
1

Python モジュールの 1 つがネットワークの状態をキャッシュしているため、最新の設定を使用していない可能性があります。すべてのネットワーク関連モジュールを再読み込みしてみてください。これの簡単な例は次のとおりです。

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の問題が問題のようでした。解決策は見つかりませんでしたが、ユースケースの回避策を作成しました。1つのURLのみを使用することを考慮して、独自の「resolv.file」を追加しました。PHYがケーブル接続を報告すると、小さなデーモンがURLのIPアドレスを取得します。このIPは「自分のresolv.conf」に保存されます。このファイルから、Pythonスクリプトは投稿に使用するIPを取得します。

本当に良い解決策ではありませんが、解決策です。

于 2012-11-30T10:16:20.383 に答える