【问题标题】:Python executing cmd and storing whatever it returnsPython 执行 cmd 并存储它返回的任何内容
【发布时间】:2020-03-29 05:11:53
【问题描述】:

我正在编写一个在 Windows 上执行 CMD 命令的脚本。我用它来解析命令到不同的应用程序。这些命令返回一些值或错误。如何强制 Python/CMD 将返回的任何命令(无论是返回值还是错误)存储在变量中,并强制它不将其打印到控制台。我尝试了 subprocess 和 os.system() 并且我尝试过的所有这些都允许存储值,但是当命令返回错误时,它仍然被打印到控制台而不是存储在变量中。

【问题讨论】:

    标签: python cmd subprocess


    【解决方案1】:

    这是 cmd 的 shell / 的属性以及您如何调用该进程。默认情况下,有一个输入流(stdin)和两个输出流(stdout 和 stderr)——后者是所有错误的默认流。

    您可以通过适当地调用脚本将其中一个或两个指向另一个或 stdin 或文件。见https://support.microsoft.com/en-us/help/110930/redirecting-error-messages-from-command-prompt-stderr-stdout

    例如

    myscript 1> output.msg 2>&1

    会将所有内容(包括错误)定向到 output.msg。现在将输出重定向与写入变量结合起来;这在this answer 中有解释。

    【讨论】:

      【解决方案2】:

      在 shell 中执行命令时,有 2 个不同的输出处理程序,stdoutstderr。通常 stdout 用于打印正常输出,stderr 用于打印错误和警告。

      您可以使用subprocess.Popen.communicate() 来读取stderrstdout

      import subprocess
      
      p = subprocess.Popen(
          "dir", 
          stdout=subprocess.PIPE,
          stderr=subprocess.PIPE,
          shell=True
      )
      (stdout, stderr) = p.communicate()
      
      print(stdout.decode('utf-8'))  # Standard output
      print(stderr.decode('utf-8'))  # Standard error
      

      【讨论】:

      • 这个解决方案有效,但是当我使用 os.system() Python 执行命令并继续下一行时。但是使用 subprocess.Popen() Python 会等待另一行,直到应用程序(我通过 CMD 启动)关闭。如何强制它“继续”?
      • 我不明白您所说的“等待另一条线”是什么意思。该命令是否需要输入?如果是这样,您可以使用p.communicate(input="whatever you want to send") 将数据发送到命令标准输入。
      • 从你写的代码,Python执行:'import subprocess cmd = subprocess.Popen("udt.exe", stdout=subprocess.PIPE, stderr=subprocess.PIPE) #它运行的应用是一个窗口应用程序”,然后暂停。什么都没发生。如果我手动关闭 udt.exe 应用程序,Python 代码将恢复并执行下一步
      猜你喜欢
      • 2018-10-29
      • 2020-04-16
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多