Как да съхранявате изхода на os.system() в променлива или списък в python

Опитвам се да получа резултата от команда, като правя ssh на отдалечен сървър, използвайки командата по-долу.

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

Резултатът от тази команда е 14549 0

защо има нула в изхода? има ли някакъв начин за съхраняване на изхода в променлива или списък? Опитах се да присвоя изход към променлива и списък също, но получавам само 0 в променливата. Използвам python 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, той не идва, но не мога да го запазя във var - person Shalomi90; 27.11.2020
comment
@Shalomi11 да, b показва, че върнатите данни са байтове, а не знаци. Вижте това за по-пълна обработка: docs.python.org/3/howto/unicode. html . В обобщение ще трябва да се декодира, за да върне низ от байтовете (напр. b'abc'.decode('utf8')). Нов ред е точно как изходът се връща от използваната основна команда. Вижте stackoverflow.com/questions/36422572/ за дискусия - person Paul; 30.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