0

このスニペットは、BSD ネットワーク インターフェイスの点線クワッドを取得します。代わりに subprocess モジュールを使用する方法を理解したいと思います。

ifcfg_lines = os.popen("/sbin/ifconfig fxp0").readlines()
x = string.split(ifcfg_lines[3])[1]

サブプロセスをまったく同じように使用できないようです。shell=True や PIPE は必要ないと思います。出力をインデックス可能にするにはどうすればよいですか?

ありがとう。

4

2 に答える 2

1
from subprocess import Popen, PIPE

ifcfg_lines = Popen("/sbin/ifconfig fxp0",shell=True,stdout=PIPE).stdout.readlines()
x = string.split(ifcfg_lines[3])[1]

もう少しエレガントにするには、詳細を非表示にします。

def getBSDIP():
   from subprocess import Popen, PIPE
   import string

   CURRENT = Popen("/sbin/ifconfig fxp0", shell=True,stdout=PIPE).stdout.readlines()
   return(string.split(CURRENT[3])[1]) 

これを行うためにサブプロセスを使用する場合、基本的にスクリーンスクレイピングのようなことを行うため、エレガンスは少し制限されますが、ここではスクリプトスクレイピングを行っています。本当に一般的な解決策が必要な場合は、ソケット ライブラリを使用します。つまり、Python に移植性を処理させます。

多くの場合、コードを少し見て、それを行うためのよりクリーンな方法があればいいのにと思うとき、これは、自分の仮定に疑問を投げかけ、ソリューションのアルゴリズムまたはアーキテクチャを変更する必要があることを意味します。

于 2009-10-20T00:14:42.907 に答える
0

次のようなものを使用しないでください:

import socket
ipadr = socket.gethostbyname(socket.gethostname())

Python でのローカル IP アドレスの検索のように、サブプロセスの依存関係を削除しますか? その質問には、他にもいくつかの提案があります。

また、より優れたクロスプラットフォーム サポートでこれを行うことを目的としたnetifacesパッケージに関する投稿も見つけました。

于 2009-10-20T00:12:04.863 に答える