web-dev-qa-db-ja.com

Linuxのコマンドラインコールはos.systemから何を返す必要がありますか?

Linuxにいくつかのコマンドライン呼び出しを行い、これからリターンを取得する必要がありますが、以下のようにすると、0のような時間値を返す必要があるときに00:08:19を返すだけです。通常のコマンドラインで同じ呼び出しを行うと、時間値00:08:19が返されるので、Pythonでそれを行う方法だと思ったので、間違っていることについて混乱しています。

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
58
Rick

返されるのは、このコマンドを実行したときの戻り値です。直接実行中に表示されるのは、stdoutのコマンドの出力です。 0が返されるということは、実行中にエラーがなかったことを意味します。

出力をキャプチャするためにpopenなどを使用します。

この線に沿ったもの:

import subprocess as sub
p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

または

import os
p = os.popen('command',"r")
while 1:
    line = p.readline()
    if not line: break
    print line

ON SO: Popenおよびpython

99
pyfunc

プロセスからの出力のみに関心がある場合は、サブプロセスを使用するのが最も簡単です ' check_output function:


output = subprocess.check_output(["command", "arg1", "arg2"]);

その後、出力はプログラム出力を標準出力に保持します。詳細については、上記のリンクを確認してください。

25
JoshD

最も簡単な方法は次のとおりです。

import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue

これはリストとして返されます

10
IonicBurger

コードは、渡されたコマンドの実行が成功した場合は0を返し、失敗した場合はゼロ以外を返します。次のプログラムはpython2.7で動作し、3以上のバージョンをチェックしています。このコードを試してください。

>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
8
vikkyhacks

IonicBurgerにコメントを追加することはできません。「50レピュテーション」がないため、新しいエントリを追加します。謝罪いたします。 os.popen()は、複数の/複雑なコマンド(私の意見)に最適であり、次のより複雑な複数のコマンドのようにstdoutを取得することに加えて、戻り値を取得するのにも最適です。

import os
out = [ i.strip() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()]
print "     stdout: ", out[:-1]
print "returnValue: ", out[-1]

これにより、名前にWord 'file'が含まれるすべてのpythonファイルがリストされます。 [...]は、各エントリから改行文字を削除(削除)するためのリスト内包表記です。 echo $?は、grepコマンドとこの例のリストの最後の項目になる最後に実行されたコマンドの戻りステータスを表示するシェルコマンドです。 2>/dev/nullは、grepコマンドのstderrを- / dev/nullなので、出力に表示されません。 'ls'コマンドの前の'r'は生の文字列を使用するため、シェルは'*'のようなメタキャラクターを誤って解釈しません。これはpython 2.7で機能します。出力例を次に示します。

      stdout:  ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py']
 returnValue:  0
2
Joe

はい、それは直感に反し、あまりPythonicではないように見えますが、実際には、Unix API設計を模倣しています。これらは、C POSIX関数です。チェック man 3 popen && man 3 system

私が使用しているos.systemを置き換えるためのやや便利なスニペット:

from subprocess import (PIPE, Popen)


def invoke(command):
    '''
    Invoke command as a new system process and return its output.
    '''
    return Popen(command, stdout=PIPE, Shell=True).stdout.read()


result = invoke('echo Hi, bash!')
# Result contains standard output (as you expected it in the first place).
2

要件として、サブプロセスpythonモジュールのPopen関数が答えです。例えば、

import subprocess
..
process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print stdout
1
Asif Hasnain

これは古いスレッドですが、純粋にos.systemを使用しており、以下はps呼び出しによって返されたデータにアクセスする有効な方法です。注:パイプを使用してデータをディスク上のファイルに書き込みます。 そして OPはos.systemを使用した解決策を特に求めませんでした。

>>> os.system("ps > ~/Documents/ps.txt")
0    #system call is processed.
>>> os.system("cat ~/Documents/ps.txt")
  PID TTY          TIME CMD
 9927 pts/0    00:00:00 bash
10063 pts/0    00:00:00 python
12654 pts/0    00:00:00 sh
12655 pts/0    00:00:00 ps
0

したがって、

>>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt")
0
>>> os.system("cat ~/Documents/ps.txt")
00:00:00
0

しかし、それらがすべてゼロを返す理由はわかりません。

1
Coriolis Force

オーケー最速の方法だと思う

import os
print(os.popen('command').readline())
x = _
print(x)
0
George