10

以下のコマンドを使用してリモートサーバーで ssh を実行して、コマンドの出力を取得しようとしています。

os.system('ssh user@host " ksh .profile; cd dir; find . -type f |wc -l"')

このコマンドの出力は 14549 0 です

出力にゼロがあるのはなぜですか? 出力を変数またはリストに格納する方法はありますか? 変数とリストにも出力を割り当てようとしましたが、変数に 0 しかありません。私はpython 2.7.3を使用しています。

4

4 に答える 4

13

これには多くの優れたSOリンクがあります。Python からシェル コマンドを実行して出力をキャプチャする、変数に os.system の出力を割り当てて、最初に画面に表示されないようにしてください 。要するに

import subprocess
direct_output = subprocess.check_output('ls', shell=True) #could be anything here.

shell=True フラグは注意して使用する必要があります。

ドキュメントから: 警告

shell=True を使用してシステム シェルを呼び出すと、信頼できない入力と組み合わせると、セキュリティ上の危険が生じる可能性があります。詳細については、よく使用される引数の警告を参照してください。

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

于 2013-10-09T14:51:10.940 に答える
1

Paul の回答に追加するには (subprocess.check_output を使用):

エラーをスローする可能性のあるコマンドで簡単に動作するように少し書き直しました (たとえば、git 以外のディレクトリで「git status」を呼び出すと、リターン コード 128 と CalledProcessError がスローされます)。

これが私のPython 2.7の例です:

import subprocess

class MyProcessHandler( object ):
    # *********** constructor
    def __init__( self ):
        # return code saving
        self.retcode = 0

    # ************ modified copy of subprocess.check_output()

    def check_output2( self, *popenargs, **kwargs ):
        # open process and get returns, remember return code
        pipe = subprocess.PIPE
        process = subprocess.Popen( stdout = pipe, stderr = pipe, *popenargs, **kwargs )
        output, unused_err = process.communicate( )
        retcode = process.poll( )
        self.retcode = retcode

        # return standard output or error output
        if retcode == 0:
            return output
        else:
            return unused_err

# call it like this
my_call = "git status"
mph = MyProcessHandler( )
out = mph.check_output2( my_call )
print "process returned code", mph.retcode
print "output:"
print out
于 2016-03-25T19:33:58.927 に答える
-3

対話型シェルで os.system() を呼び出している場合、os.system() はコマンドの標準出力 ('14549'、wc -l 出力) を出力し、次にインタープリターは関数呼び出し自体の結果を出力します。 (0、コマンドからのおそらく信頼できない終了コード)。より単純なコマンドの例:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("echo X")
X
0
>>>
于 2013-10-09T09:22:05.570 に答える