【问题标题】:Python executing commands and storing result in a variable [duplicate]Python执行命令并将结果存储在变量中[重复]
【发布时间】:2014-08-10 19:22:49
【问题描述】:

我想执行shell命令(比如说ubuntu的ls -a命令)

现在,在阅读了几个 SOF 线程之后,我发现 subprocess 模块是最好的。真的是这样吗?

from subprocess import call
t = call(['ls', '-a'])
print t

当我运行这个脚本时,它只是在我的系统终端上打印了结果,变量t 得到了值0

shell=False 也不起作用;我刚刚试了一下。

我如何将结果存储在变量中而不是将其打印到终端(或者也可以打印到终端,如果无法摆脱它的话)?

我们可以为此目的使用任何其他库吗?

编辑:

t = os.popen('ls -a').read()

这行得通!但是这是否有任何错误或一些问题?

【问题讨论】:

  • PyPI 上有很多比subprocess 更高级别的第三方库,您可能想看看。对于你正在做的事情,你可能不需要他们的任何花哨的东西,但你可能会发现它们在未来很有用。
  • 顺便说一句,0ls 程序的返回值。每个程序都会返回一个小整数作为值,0 几乎总是意味着成功。就像 shell 有不同的方式来运行一个程序并存储它的返回值,与运行一个程序并捕获它的输出一样,subprocess 对两者有不同的功能。

标签: python python-2.7 python-3.x subprocess


【解决方案1】:

使用subprocess.check_output 捕获输出。

from subprocess import check_output
t = check_output(['ls', '-a'])
print t

请注意,如果 ls 返回非零退出代码,这将引发 CalledProcessError 异常。

至于您问题的另一部分,subprocess 模块是在 Python 中运行子进程的首选(也是最好的 IMO)方式。你应该喜欢它而不是os.popen

【讨论】:

  • 如果我使用sudo,如何传递密码。如果我只是写t = check_output(['sudo', 'ls', '-a']),那么它会要求我输入密码,但是有什么方法可以传入我的程序。
【解决方案2】:
from subprocess import PIPE,Popen
t = Popen(['ls', '-a'],stdout=PIPE)
t = t.communicate()[0]

【讨论】:

  • 虽然这可能会回答问题,但请在其中添加一些评论您在做什么以及为什么!
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 2020-08-14
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2023-04-07
相关资源
最近更新 更多