Linuxにいくつかのコマンドライン呼び出しを行い、これからリターンを取得する必要がありますが、以下のようにすると、0
のような時間値を返す必要があるときに00:08:19
を返すだけです。通常のコマンドラインで同じ呼び出しを行うと、時間値00:08:19
が返されるので、Pythonでそれを行う方法だと思ったので、間違っていることについて混乱しています。
import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
返されるのは、このコマンドを実行したときの戻り値です。直接実行中に表示されるのは、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
プロセスからの出力のみに関心がある場合は、サブプロセスを使用するのが最も簡単です ' check_output function:
output = subprocess.check_output(["command", "arg1", "arg2"]);
その後、出力はプログラム出力を標準出力に保持します。詳細については、上記のリンクを確認してください。
最も簡単な方法は次のとおりです。
import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue
これはリストとして返されます
コードは、渡されたコマンドの実行が成功した場合は0
を返し、失敗した場合はゼロ以外を返します。次のプログラムはpython2.7で動作し、3以上のバージョンをチェックしています。このコードを試してください。
>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
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
はい、それは直感に反し、あまり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).
要件として、サブプロセス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
これは古いスレッドですが、純粋に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
しかし、それらがすべてゼロを返す理由はわかりません。
オーケー最速の方法だと思う
import os
print(os.popen('command').readline())
x = _
print(x)