0

多くの人にとっては簡単なことだと思いますが、私にとってはそうではありません。シェルからデータを出力しようとしていますが、文字列に変換する必要があるときに行き詰まります。で試しましforたが、うまくいきませんでした。基本的に、私がしようとしているのは、シェルの新しい行ごとに、新しい行を出力することです。コマンドの例を挙げますfree -m。その出力は

  total       used       free     shared    buffers     cached
  Mem:           144        512        111          0          0        121
  -/+ buffers/cache:         23        232
  Swap:            0          0          0

だから、私がこれまでに書いたことは次のとおりです。

import commands
foo...
sout = commands.getstatusoutput(inp)
    return ' '.join(str(line) for line in sout)
foo...

ただし、出力は1行のみです(最初の行-合計、使用、無料、共有など)

シェルの出力のように、新しい行ごとに新しい行が必要です。.join なしでそのままにしておくと、次のような出力が得られます

(0, '             total       used       free     shared    buffers     cached\nMem:           512        144        368          0          0        121\n-/+ buffers/cache:         21        234\nSwap:            0          0          0')

文字列にしたいので、 も試してみましたが、 (wtf)'\n'.joinしか出力されませんでした。0何か案は?

4

4 に答える 4

1

はるかに便利な os.popen を使用することもできます。

print os.popen('free -m').read()

このスレッドを読んで、Python 内からシェル コマンドを実行するために使用できるオプションの概要を理解することをお勧めしますPython で外部コマンドを呼び出す

于 2013-01-27T17:37:31.227 に答える
0

文字列全体が改行とすべてを含むタプルに含まれているため、次のことを行う必要があると思います。

print sout[1]

soutそれがあなたの質問に表示されるタプルであると仮定します:

(0, '             total       used       free     shared    buffers     cached\nMem:           512        144        368          0          0        121\n-/+ buffers/cache:         21        234\nSwap:            0          0          0')
于 2013-01-27T17:31:44.957 に答える
0

改行文字をチェックしてから、出力に改行文字を挿入するだけです。ここで実際に全体として入力を取得します。それが役に立てば幸い

于 2013-01-27T17:41:21.513 に答える
0

同じ結果を得る別の方法があります。

    from subprocess import Popen, PIPE
    // Create a subprocess and then interact with the process by reading data from 
    // stdout, untill the end-of-file is reached. Since communicate return tuple 
    // in the form of stdout, stderr), Capture only the output.

    (result, errcode) = Popen('free -m', stdout = PIPE, shell = True).communicate()
    print result
于 2013-01-27T18:00:10.920 に答える