Python subprocess.Popen结果存储在变量中

时间:2012-06-28 15:45:32

标签: python-3.x subprocess

我已经看到过关于此的其他各种帖子,但不幸的是我仍然无法解决这个问题:

如果我这样做:

temp = subprocess.Popen("whoami", shell=True, stdout=subprocess.PIPE)
out = temp.communicate()
print(out)

然后我得到了一些形式

(b'username\n', None)

通过其他尝试(例如添加.wait()),我一直在一行获取用户名,并在下一行获取0作为返回码,但只有0存储在我的变量中。 / p>

有一种简单的方法可以格式化,只在变量中存储用户名吗?我尝试了类似的东西[3:11],但这没效果。

由于

4 个答案:

答案 0 :(得分:3)

最简单的方法是使用subprocess.check_output()

username = subprocess.check_output("whoami").strip()

答案 1 :(得分:1)

username = subprocess.check_output(['whoami']).strip()

或更好:

username = getpass.getuser()

答案 2 :(得分:1)

添加universal_newlines=True参数告诉subprocess调用返回字符串。我一直在使用它而不是显式解码字节流。

temp = subprocess.Popen("whoami", 
                        shell=True, 
                        stdout=subprocess.PIPE, 
                        universal_newlines=True)
out = temp.communicate()
print(out)

# prints: ('username\n', None)

Subprocess docs

  

如果universal_newlines为True,则文件对象 stdin stdout stderr 将作为 universal newlines 模式使用locale.getpreferredencoding(False)返回的编码。

答案 3 :(得分:0)

communicate之后,您可以阅读temp.returncode的返回代码。

来自http://docs.python.org/dev/library/subprocess.html#subprocess.Popen.returncode

  

Popen.returncode   子返回码,由poll()和wait()设置(间接由communic()设置)。 “无”值表示该进程尚未终止。

如果您关心的是呼叫成功,请使用subprocess.check_output;非零回报将提升CalledProcessError