3

今、私はサブプロセスを使用して、それがうまく機能するかどうかを呼び出しfindますが、私は物事を行うためのpythonicな方法を求めています。

現在のコードは次のとおりです。

cmd = "find /sys/devices/pci* | grep '/net/' |grep address"
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

出力では、次のリストを受け取ります。

[root@host1 ~]# find /sys/devices/pci* |grep '/net/'|grep 'address'
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:00.0/0000:08:00.0/net/eth0/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:01.0/0000:09:00.0/net/eth1/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:02.0/0000:0a:00.0/net/rename4/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:03.0/0000:0b:00.0/net/eth3/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:04.0/0000:0c:00.0/net/eth4/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:05.0/0000:0d:00.0/net/eth5/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:06.0/0000:0e:00.0/net/eth6/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:07.0/0000:0f:00.0/net/eth7/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:08.0/0000:10:00.0/net/eth8/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:09.0/0000:11:00.0/net/eth9/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:0a.0/0000:12:00.0/net/eth10/address
/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0/0000:05:00.0/0000:06:00.0/0000:07:0b.0/0000:13:00.0/net/eth11/address

さて、そうすれば、ディレクトリのリストを取得し、ファイルを探すこともできますが、サブプロセスを介しても、glob.glob('/sys/devices/pci*/*/*/*/*/*/*/net/')間違いなく時間がかかるようです。findさらに、一連の結果は膨大であり、特定のホストのアーキテクチャが同じディレクトリ構造を持つかどうかを事前に知ることができないため、に入力するアスタリスクの数がわかりませんglob.glob()

私の質問は、単純なコマンドが達成する動作をどのように繰り返すことができるかfind | grep、あるいは、アクティブかどうかにかかわらず、ホストが持っているすべてのNICのすべてのMACを見つけるためのより良い方法があるかどうかです(特定のMACを探しています)ここのパターン)

編集:globを使用するべきではなかった、os.walkは仕事をしているようです:

>>> for root, dirs, names in os.walk('/sys/devices/'):
...     if 'address' in names and 'pci' in root:
...         f = open(str(root + '/address'), 'r')
...         mac = f.readlines()[0].strip()
...         f.close()
...         print mac
...         eth = root.split('/')[-1]
...         print eth
4

1 に答える 1

4

os.walk()をチェックアウトしましたか?

import os
for root, dirs, names in os.walk(path):
    ...

http://docs.python.org/library/os.html#os.walk

上記のリンクから、特定のディレクトリをスキップする方法は次のとおりです。

import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print root, "consumes",
    print sum(getsize(join(root, name)) for name in files),
    print "bytes in", len(files), "non-directory files"
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories
于 2012-10-04T19:02:42.577 に答える