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 运行 shell 命令并捕获输出将 os.system 的输出分配给变量,并防止它显示在屏幕上 以供初学者使用。简而言之

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

应谨慎使用 shell=True 标志:

来自文档:警告

如果与不受信任的输入结合使用,则使用 shell=True 调用系统 shell 可能会带来安全隐患。有关详细信息,请参阅常用参数下的警告。

有关更多信息,请参阅:http: //docs.python.org/2/library/subprocess.html

于 2013-10-09T14:51:10.940 回答
10

您可以使用os.popen().read()

import os
out = os.popen('date').read()

print out
Tue Oct  3 10:48:10 PDT 2017
于 2017-10-03T17:52:39.003 回答
1

要添加到保罗的答案(使用 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

如果您在交互式 shell 中调用 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 回答