2

我已经看到了有关此的各种其他帖子,但不幸的是我仍然无法弄清楚这一点:

如果我做这样的事情:

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

然后我得到一些形式

(b'username\n', None)

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

有没有一种简单的方法可以格式化它以仅将用户名存储在变量中?我尝试了类似 out[3:11] 的方法,但没有奏效。

谢谢

4

4 回答 4

5

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

username = subprocess.check_output("whoami").strip()
于 2012-06-28T15:50:39.387 回答
1
username = subprocess.check_output(['whoami']).strip()

或更好:

username = getpass.getuser()
于 2012-06-28T15:51:29.887 回答
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)

子流程文档

如果universal_newlines 是True,文件对象stdinstdoutstderr将使用返回的编码以通用换行符locale.getpreferredencoding(False)模式作为文本流打开。

于 2013-05-30T03:07:27.170 回答
0

之后communicate,您可以从中读取返回码temp.returncode

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

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

如果您只关心调用是否成功,请使用subprocess.check_output; 非零回报将提高CalledProcessError

于 2012-06-28T15:52:19.873 回答