【问题标题】:Subprocess Command Output? [duplicate]子进程命令输出? [复制]
【发布时间】:2022-01-22 00:41:09
【问题描述】:

我已经尝试了几个小时将 shell 命令的输出作为字符串。我尝试了subprocessos,但都没有成功,在subprocess 内我尝试过check_output()getoutput()Popen()communicate(),以及我能做的所有其他事情在这个网站和许多其他网站上找到。

有时我会遇到诸如FileNotFoundError: [WinError 2] The system cannot find the file specified 之类的错误,尽管我能够相对迅速地修复这些错误,但是当代码确实有效时,我尝试打印命令的输出,要么它什么都不返回(如in,它打印空白),或者它打印(b'', b'')(b'', None)

decode() 不起作用,encoding 没有改变任何东西,我什至尝试过:

subpr = str(process)

当然,它什么也没做。

你如何得到一个shell命令的输出,作为一个字符串?

其他尝试:

subpr = (Popen(commandRun,shell=True,stdout=PIPE,stderr=PIPE,universal_newlines=True).communicate()[0])

process = subprocess.getoutput(commandRun)

process = subprocess.check_output(commandRun,shell=True)

process = subprocess.check_output(commandRun,stdout=PIPE,shell=True)

process = Popen(commandRun,stdout=PIPE,shell=True)
subpr = process.communicate()[0]

output = Popen(commandRun,shell=True,stdout=PIPE,stderr=PIPE)
subpr = output.communicate()

进口:

import subprocess
from subprocess import Popen, PIPE

没有太多要添加的代码。除了那条虚线之外,我没有写任何关于子流程的东西。

【问题讨论】:

  • 您能添加更多代码吗?您对subprocess 的调用可能有问题。
  • 这条线 subpr = (subprocess.Popen(commandRun,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True).communicate()[0]) 也有效。你确定你正在运行的进程没有问题吗?
  • 你用的是哪个python版本?
  • 我不知道,有可能。 commandRun 变量是两个命令的组合,我可能错误地将它们串在一起。第一部分是将文件路径设置为我磁盘上的原始路径,然后第二部分是实际命令。没有文件路径,该命令不起作用。
  • 您使用的是 Windows 吗?

标签: python string shell


【解决方案1】:

你打算如何使用这些?

我有以下有效的代码,将 STDERR 重定向到 STDOUT,因为我想让它们合并:

import subprocess
args = ["whoami"]
run = subprocess.run(args, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print(run.stdout)

如果您想将进程连接在一起,最好的方法可能是将教皇放入Popen 的参数中,请参阅https://docs.python.org/3/library/subprocess.html#replacing-bin-sh-shell-command-substitution

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

【讨论】:

  • 这对我来说什么也没打印。我正在尝试使用它在 shell 中运行命令,然后获取所述命令的输出并将其写入文件(同时打印它)。
  • whoami 不打印任何内容?还是使用其他命令?
  • whoami 有效,所以我认为您是正确的,这与我的命令有关
  • 您是否为命令使用了正确的分隔符? |管道(管道)一个命令的标准输出(stdout)到另一个命令的标准输入。请注意,无论发生什么情况,stderr 仍会进入其默认目的地。 && 仅当前一个成功时才执行 && 的右手命令。
  • @SAIJAL 我认为这可能与文件路径有关-命令的前半部分是设置命令的路径
猜你喜欢
  • 2021-12-10
  • 2013-08-27
  • 2011-09-30
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
相关资源
最近更新 更多