当前位置: 首页 > 面试题库 >

子进程communication()的“是”报告错误

曾光誉
2023-03-14
问题内容

我正在使用以下函数在Python中运行命令:

def run_proc(cmd):
    child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    returncode = child.returncode
    return stdout, stderr, returncode

它一直都运行良好,但是现在我正尝试使用该yes程序将输出传递给stdin。我尝试运行的命令如下:

yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

但我相信可以用一般示例代替它,例如:

yes | head -3 | cat

我的问题是,如果我尝试运行其中包含的任何命令yes |,则上面的subprocess.Popen将包含错误消息:

yes: standard output: Broken pipe
yes: write error

对我来说,管道似乎仍然有效,从yes | head -3 | cat的答案可以看出:y y y

我有以下问题:

  1. 即使yes报告错误,yes管道是否仍然有效?
  2. 我该如何解决?

问题答案:

问题在于,Python
3.2+之前的
subprocess模块无法将SIGPIPE信号处理程序恢复为默认操作。这就是为什么您会收到EPIPE写入错误的原因。

在Python 3.2+中

>>> from subprocess import check_output
>>> check_output("yes | head -3", shell=True)
b'y\ny\ny\n'

yes退出SIGPIPE时被杀死head

在Python 2中:

>>> from subprocess import check_output
>>> check_output("yes | head -3", shell=True)
yes: standard output: Broken pipe
yes: write error
'y\ny\ny\n'

yes得到EPIPE写错误。可以忽略该错误

要解决该问题,您可以restore_signals使用preexec_fn参数在Python 2中进行仿真:

>>> from subprocess import check_output
>>> import signal
>>> def restore_signals(): # from http://hg.python.org/cpython/rev/768722b2ae0a/
...     signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ')
...     for sig in signals:
...         if hasattr(signal, sig):
...            signal.signal(getattr(signal, sig), signal.SIG_DFL)
... 
>>> check_output("yes | head -3", shell=True, preexec_fn=restore_signals)
'y\ny\ny\n'


 类似资料:
  • 当简单报表不适用于子报表时,此操作有效...

  • 错误日志对于发现程序中的错误是非常有帮助的,但是有些时候它也会将应用程序的结构暴露给外部。为了有效的保护你的应用程序不受到由此而引发的问题。你需要将在你的服务器上使用开发和生产(线上)两套不同的配置。 开发环境 为了在开发环境中显示所有可能的错误,将你的 php.ini 进行如下配置: display_errors = On display_startup_errors = On error_re

  • 我试图通过一个类中的函数连接到MySql。同样的事情可以做得更容易,但这也是一次学习的经历。代码全部按预期工作,但是如果MySql查询失败,mysqli_error()返回空白,mysqli_errno()返回0。我在手动将数据输入mysql时发现了错误,并且它在db中是一个太短的列,但是我不明白为什么mysqli_error()和mysql_errno()都没有报告这个错误。提前感谢您的任何帮助

  • 1.1.2. 错误报告 没有不会犯错的开发者,PHP的错误报告功能将协助您确认和定位这些错误。可以PHP提供的这些详细描述也可能被恶意攻击者看到,这就不妙了。使大众看不到报错信息,这一点很重要。做到这一点很容易,只要关闭display_errors,当然如果您希望得到出错信息,可以打开log_errors选项,并在error_log选项中设置出错日志文件的保存路径。 由于出错报告的级别设定可以导致

  • 我的应用程序中有几个类似的报告,因此我创建了一个基本结构,在标题中有一个子报告,在页脚中有另一个子报告。 我不知道为什么我找不到解决这个问题的方法,如果有人能帮我...谢谢!

  • 我最近将我的项目从JUnit5转换为TestNG,完全是为了得到体面的报告。 我添加了一个监听器,它在每次运行结束时生成报告: 我的问题是,通过电子邮件发送的报告不是来自当前运行,而是来自上一次运行。 然而,如果我使用Eclipse IDE在/test-output/custom-report.html中打开报告,它是正确的! 我如何确保发出的电子邮件是最新的? 当我将对sendEmail的调用移