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

标签 python apache cgi subprocess

我尝试使用这个简单的脚本通过 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/

相关文章:

Python 请求 SSL 证书验证失败,即使添加了 CA 证书

php - 如何防止大型 Apache/PHP 文件上传失败?

apache - Ubuntu 11.10服务器上的Apache2在哪里配置 "ServerTokens"和 "ServerSignature"?

Apache/Tomcat/mod_jk 当你使用 Webjars 时......可能吗?

python - 使用 python 的 cgi 脚本

c - 可以以编程方式更新的系统全局计数器(在各种 Linux 版本上)?

javascript - 在SSIS中使用javascript还是python?

python - fastapi 异步后台任务会阻止其他请求吗?

php - 如何在 PHP 和 Perl CGI 之间共享 session 信息?

python - 自合并后 Pandas Dataframe 中出现重复