LinuxコマンドラインコールOS.Systemから何をすべきかを返さない?
-
05-10-2019 - |
質問
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
SO: PopenとPython
他のヒント
プロセスからの出力にのみ興味がある場合は、サブプロセスを使用するのが最も簡単です。 check_output 働き:
output = subprocess.check_output(["command", "arg1", "arg2"]);
その後、出力はプログラムの出力をSTDOUTに保持します。詳細については、上記のリンクを確認してください。
最も簡単な方法は次のようです:
import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue
これはリストとして返されます
コードが返されます 0
渡されたコマンドの実行が成功し、失敗した場合はゼロではありません。次のプログラムは、Python2.7で動作し、Havenは上記の3とバージョンをチェックしました。このコードを試してください。
>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
はい、それは直感に反するものであり、あまりパトニックではないように見えますが、実際には、これらの呼び出しがc posix関数であるUnix APIデザインを模倣しているだけです。小切手 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).
コメントを追加できません イオニクバーガー 「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]
これにより、単語があるすべてのPythonファイルが一覧表示されます 'ファイル' その名前のどこにでも。 [...] 各エントリからnewline文字を削除(ストリップ)するためのリストの理解です。 echo $? この例では、GREPコマンドとリストの最後の項目となります。 2>/dev/null 印刷すると言います stderr の グレップ コマンドに /dev/null したがって、出力には表示されません。 'r' の前に 'ls' コマンドは、生の文字列を使用して、シェルがメタチャラクターを次のように解釈しないようにします '*' 間違っています。これはPython 2.7で機能します。これがサンプルの出力です。
stdout: ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py']
returnValue: 0
これは古いスレッドですが、純粋に使用しています 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
なぜ彼らがすべてゼロを返しているのか分かりません。
あなたの要件については、サブプロセス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
okey私はそれが最速の方法だと信じています
import os
print(os.popen('command').readline())
x = _
print(x)
using commands module
import commands
"""
Get high load process details
"""
result = commands.getoutput("ps aux | sort -nrk 3,3 | head -n 1")
print result -- python 2x
print (result) -- python 3x