我希望能够在Python脚本中获取一些shell命令(如ls
或df
)的输出。我发现commands.getoutput('ls')
已被弃用,但subprocess.call('ls')
只能获取返回代码。
我希望有一些简单的解决方案。
我希望能够在Python脚本中获取一些shell命令(如ls
或df
)的输出。我发现commands.getoutput('ls')
已被弃用,但subprocess.call('ls')
只能获取返回代码。
我希望有一些简单的解决方案。
使用 subprocess.Popen:
import subprocess
process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
print(out)
请注意,communicate 命令会一直阻塞直到进程终止。如果您需要在进程终止之前获取输出,可以使用process.stdout.readline()。更多信息请参见文档。
如果使用 Python 版本大于等于 2.7,可以使用 subprocess.check_output()
。
http://docs.python.org/2/library/subprocess.html#subprocess.check_output
subprocess.check_output(cmd, shell=True)
。 - Cerin使用subprocess.check_output()
捕获错误时,您可以使用CalledProcessError
。 如果您想将输出作为字符串使用,请从字节码解码。
# \return String of the output, stripped from whitespace at right side; or None on failure.
def runls():
import subprocess
try:
byteOutput = subprocess.check_output(['ls', '-a'], timeout=2)
return byteOutput.decode('UTF-8').rstrip()
except subprocess.CalledProcessError as e:
print("Error in ls -a:\n", e.output)
return None
subprocess
示例的正确文档链接是: http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module;对于Python 3.2,链接是http://docs.python.org/py3k/library/subprocess.html#replacing-older-functions-with-the-subprocess-module。 - Ned Deilyout
参数,一切正常,但err
将未被初始化且错误输出将被打印到屏幕上。你需要除了指定stdout
之外还要指定stderr=subprocess.PIPE
才能获取标准错误信息。 - Gerrit-Ksubprocess.Popen(["echo", out, ">>", "/home/ec2-user/output_test.sh"], stdout=subprocess.PIPE)
。 - Kyle Bridenstine