什么是subprocess.getstatusoutput(Python中较旧的命令.setstatusoutput()的多平台替代方案?

什么是subprocess.getstatusoutput(Python中较旧的命令.setstatusoutput()的多平台替代方案?,python,redirect,process,Python,Redirect,Process,以下代码在Python 3.0中已过时,被subprocess.getstatusoutput()替换 真正的问题是什么是Python中此命令的多平台替代方案,因为上面的代码在Windows下确实失败了,因为getstatusoutput仅在Unix下受支持,而Python没有告诉您这一点,相反,您会得到如下结果: >test.py 1 '{' is not recognized as an internal or external command, operable program or

以下代码在Python 3.0中已过时,被
subprocess.getstatusoutput()
替换

真正的问题是什么是Python中此命令的多平台替代方案,因为上面的代码在Windows下确实失败了,因为getstatusoutput仅在Unix下受支持,而Python没有告诉您这一点,相反,您会得到如下结果:

>test.py
1
'{' is not recognized as an internal or external command,
operable program or batch file.

<>我不会真的考虑这个多平台,但是你可以使用<代码>子进程。Popen < /代码>:

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
之后,我做了一些更改

import commands
(ret, out) = commands.getstatusoutput('some command')
print ret
print out

问题是,
dir
实际上不是一个多平台调用,但允许您在任何平台上执行shell命令。除非您绝对需要,否则我将避免使用shell命令。请调查,而不是包的内容

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)

getstatusoutput文档说它像这样运行命令:

{cmd}2>&1

这显然不适用于cmd.exe(不过,如果需要,2>&1可以正常工作)

您可以如上所述使用Popen,但也可以包括参数“stderr=subprocess.STDOUT”以获得与getstatusoutput相同的行为


但是,我在Windows上的测试将returncode设置为None,如果您指望返回值,这并不理想。

这将是getstatusoutput()的多平台实现:


谢谢。我想你没有使用社区维基选项,因为我无法更新你的答案。我改为添加了另一个。它被标记为社区维基,但我认为你的声誉必须超过100才能编辑;)哦,在这种情况下,您能否使用我在最后一个答案上发布的代码更新您的解决方案,以便我可以接受回答并清理问题?谢谢。感谢您提供的silver bullet.works在Windows Python 2.7上为我所用——非常感谢这部代码杰作
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