Конечно, это просто не будет настолько же довольно как использовать язык со встроенной поддержкой. Я даже записал "объектно-ориентированный ассемблер".
Это будет мультиплатформенная реализация для 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
getstatusoutput docs говорят, что он запускает команду следующим образом:
{cmd} 2> & 1
Что явно не работает с cmd.exe (2> & 1 работает нормально, если он вам нужен).
Вы можете использовать Popen, как указано выше, но также включить параметр stderr = subprocess.STDOUT, чтобы получить то же поведение, что и getstatusoutput.
Мои тесты в Windows имели код возврата, установленный на None, что не идеально, если вы рассчитываете на возвращаемое значение.
Я бы не стал рассматривать этот мультиплатформенный , но вы можете использовать подпроцесс . Открытие
:
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)