4

Python 内から bash コマンドを使用する最良の方法を探しています。どのような方法がありますか?私は os.system と subprocess.Popen を知っています。

私はこれらを試しました:

bootfile = os.system("ls -l /jffs2/a.bin | cut -d '/' -f 4")
print bootfile

これは期待どおりに a.bin を返しますが、後で 0 を返すため、次のように出力されます。

a.bin
0

bootfile は現在 0 に設定されています。次に bootfile を印刷すると、0 と表示されます。終了値はどれだと思いますか。この値が干渉しないようにするにはどうすればよいですか?

私も試しました:

bootfile = subprocess.Popen("ls -l /jffs2/a.bin | cut -d '/' -f 4")
print bootfile

しかし、何も返されないため、スクリプトが壊れているようです。正しく実行しましたか?

また、これらのうちどれが優れていますか、またその理由は何ですか? 他の方法はありますか?また、どの方法が好ましいですか?

4

3 に答える 3

3

os.readlink(@kojiro によって提案された)を使用しos.path.basename、namefile のみを取得する場合:

os.path.basename(os.readlink('/jffs2/a.bin'))
于 2013-02-28T14:16:28.507 に答える
2

小次郎のコメントos.readlinkはおそらくあなたが望むものです。あなたが実装しようとしていたことを説明しています。

os.systemコマンド実行の終了ステータスを返します。

subprocess.Popenコマンド実行の出力をキャプチャできるように、パイプが作成されます。
以下の行は、コマンド実行の出力をキャプチャします。

bootfile = subprocess.Popen(["bash","-c","ls -l /jffs2/a.bin | cut -d '/' -f 4"], stdout=subprocess.PIPE).communicate()[0]

詳細については、http://docs.python.org/library/subprocess.htmlを参照してください。

于 2013-02-28T13:25:14.083 に答える
1

@kojiro が言うように、正しい答えは次のとおりです。

os.readlink('/jffs2/a.bin')

しかし、これを本当に複雑な方法で行いたい場合は、Python 2.7 で次のようにします。

cmd = "ls -l /jffs2/a.bin | cut -d '/' -f 4"
bootfile = subprocess.check_output(cmd, shell=True)

または古い Python の場合:

cmd = "ls -l /jffs2/a.bin | cut -d '/' -f 4"
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
bootfile = p.communicate()[0]
if p.returncode != 0:
    raise Exception('It failed')
于 2013-03-01T11:11:37.153 に答える