Как сохранить вывод os.system() в переменной или списке в python

Я пытаюсь получить вывод команды, выполнив ssh на удаленном сервере, используя приведенную ниже команду.

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

Вывод этой команды 14549 0

почему на выходе ноль? есть ли способ сохранить вывод в переменной или списке? Я попытался назначить вывод переменной и списку, но я получаю только 0 в переменной. Я использую питон 2.7.3.


person Jitu    schedule 09.10.2013    source источник
comment
Если вы используете Python 2.7, используйте модуль subprocess вместо os.system.   -  person Fred Foo    schedule 09.10.2013


Ответы (4)


На этом есть много хороших ссылок 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

person Paul    schedule 09.10.2013
comment
Привет, мой вывод имеет следующие символы: b'Fri Nov 27 14:20:49 CET 2020\n' . b' и \n' . Знаете ли вы, почему это происходит? @paul Если я использую os.system, он не приходит, но я не могу сохранить его в переменной - person Shalomi90; 27.11.2020

вы можете использовать os.popen().read()

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

print out
Tue Oct  3 10:48:10 PDT 2017
person stingray    schedule 03.10.2017

Чтобы добавить к ответу Пола (используя subprocess.check_output):

Я немного переписал его, чтобы упростить работу с командами, которые могут вызывать ошибки (например, вызов «git status» в каталоге, отличном от git, вызовет код возврата 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
person Simon    schedule 25.03.2016

Если вы вызываете 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
>>>
person Lorenzo Gatti    schedule 09.10.2013
comment
мне кажется это не ответ на вопрос - person pythonian29033; 13.10.2014