gpt4 book ai didi

python - 为什么在使用 subprocess.call() 时,我在这个简单的 Python-CGI 上不断收到错误 500?

转载 作者:行者123 更新时间:2023-12-01 05:06:23 25 4
gpt4 key购买 nike

我尝试使用这个简单的脚本通过 Python 2.7 CGI 触发系统调用:

import subprocess

print 'Content-Type:text/html'
print
print '<!DOCTYPE html>'
print '<html>'
print '<body>'
print '<pre>'

try:
subprocess.check_call('/bin/ls')
except:
pass

print '</pre>'
print '</body>'
print '</html>'

该脚本在 shell 中运行良好(即使使用 Apache 用户运行它),但在通过 Web 服务器运行 CGI 时我总是收到错误 500。我尝试设置 shell=True 但这没有什么区别。我在 Apache 错误日志中收到的唯一消息是:

malformed header from script.

但是,如果我取消注释 标记内的子进程调用,Apache 将不再提示 header ,并且我会收到预期结果(状态 200,但当然没有系统调用)。

我错过了什么吗?我是否已将 Apache 配置为允许来自 CGI 的系统调用?此类配置是否必须在本地(.htaccess)或全局(/etc/apache2/...)进行?关于如何解决这个问题有什么建议吗?如有任何帮助,我们将不胜感激。

最佳答案

这显然是因为子进程生成输出,该输出没有通过调用者的标准输出(如应有的那样)传输,而是直接刷新到输出。因此,实际上,ls 的输出最终作为 CGI header ,因此出现 500 错误。

os.popen 有效,因为它为您执行了预期的标准输出管道。

但是您也可以通过这种(首选)方式执行相同的操作:

p = subprocess.Popen('/bin/ls')

(注意:子进程现在异步运行,与原来的 subprocess.check_call 不同。如果您需要同步调用(例如,您需要子进程的输出...),您可以做类似的事情

out, err = p.communicate()
print(out)

等等。逼近原始同步控制流程。并且不要忘记将 stdout=PIPE 添加到 Popen() 调用中。)

关于python - 为什么在使用 subprocess.call() 时,我在这个简单的 Python-CGI 上不断收到错误 500?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com