我正在使用以下函数在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
。
我有以下问题:
问题在于,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的调用移