Что многоплатформенное альтернативно к subprocess.getstatusoutput (более старый commands.setstatusoutput () из Python?

Конечно, это просто не будет настолько же довольно как использовать язык со встроенной поддержкой. Я даже записал "объектно-ориентированный ассемблер".

9
задан 3 revs 16 August 2016 в 09:42
поделиться

3 ответа

Это будет мультиплатформенная реализация для getstatusoutput ():

def getstatusoutput(cmd): 
    """Return (status, output) of executing cmd in a shell."""
    """This new implementation should work on all platforms."""
    import subprocess
    pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, universal_newlines=True)  
    output = "".join(pipe.stdout.readlines()) 
    sts = pipe.returncode
    if sts is None: sts = 0
    return sts, output
8
ответ дан 4 December 2019 в 12:20
поделиться

getstatusoutput docs говорят, что он запускает команду следующим образом:

{cmd} 2> & 1

Что явно не работает с cmd.exe (2> & 1 работает нормально, если он вам нужен).

Вы можете использовать Popen, как указано выше, но также включить параметр stderr = subprocess.STDOUT, чтобы получить то же поведение, что и getstatusoutput.

Мои тесты в Windows имели код возврата, установленный на None, что не идеально, если вы рассчитываете на возвращаемое значение.

1
ответ дан 4 December 2019 в 12:20
поделиться

Я бы не стал рассматривать этот мультиплатформенный , но вы можете использовать подпроцесс . Открытие :

import subprocess
pipe = subprocess.Popen('dir', stdout=subprocess.PIPE, shell=True, universal_newlines=True)
output = pipe.stdout.readlines()
sts = pipe.wait()
print sts
print output

Вот замена для getstatusoutput :

def getstatusoutput(cmd): 
    """Return (status, output) of executing cmd in a shell."""
    """This new implementation should work on all platforms."""
    import subprocess
    pipe = subprocess.Popen(cmd, shell=True, universal_newlines=True,
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = str.join("", pipe.stdout.readlines()) 
    sts = pipe.wait()
    if sts is None:
        sts = 0
    return sts, output

Этот фрагмент был предложен авторами исходного текста. Я внес некоторые изменения, поскольку getstatusoutput дублирует stderr на stdout .


Проблема в том, что dir на самом деле не является мультиплатформенным вызовом, а subprocess.Popen позволяет вам выполнять команды оболочки на любой платформе. Я бы не стал использовать команды оболочки, если в этом нет крайней необходимости. Вместо этого изучите содержимое пакетов os , os.path и shutil .

import os
import os.path
for rel_name in os.listdir(os.curdir):
  abs_name = os.path.join(os.curdir, rel_name)
  if os.path.isdir(abs_name):
    print('DIR:  ' + rel_name)
  elif os.path.isfile(abs_name):
    print('FILE: ' + rel_name)
  else:
    print('UNK?  ' + rel_name)
8
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: