【问题标题】:Python subprocess.Popen result stored in a variablePython subprocess.Popen 结果存储在一个变量中
【发布时间】:2012-06-28 15:45:31
【问题描述】:

我看过其他各种关于此的帖子,但不幸的是我仍然无法弄清楚:

如果我这样做:

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

然后我得到某种形式的东西

(b'username\n', None)

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

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

谢谢

【问题讨论】:

    标签: python-3.x subprocess


    【解决方案1】:

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

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

    【讨论】:

    • 我不是一个重度 Linux 用户,所以也许我应该知道这一点,但是围绕我的输出的 'b' 和单引号是什么? print(username) 结果为 b'username'
    • @Matt:这与 Linux 无关。结果是一个bytes 对象。您可以通过解码将其转换为字符串,例如username.decode("ascii").
    【解决方案2】:
    username = subprocess.check_output(['whoami']).strip()
    

    或者更好:

    username = getpass.getuser()
    

    【讨论】:

      【解决方案3】:

      添加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,文件对象stdinstdoutstderr将在@中作为文本流打开987654323@ 模式使用locale.getpreferredencoding(False)返回的编码。

      【讨论】:

        【解决方案4】:

        communicate之后,可以读取temp.returncode的返回码。

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 2021-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多