繁体   English   中英

为什么在使用subprocess.call()时,在此简单的Python-CGI上仍然出现错误500?

[英]Why do I keep getting Error 500 on this simple Python-CGI when using subprocess.call()?

我尝试使用以下简单脚本通过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不再抱怨标题,我收到了预期的结果(状态200,但当然没有系统调用)。

我想念什么吗? 我是否已配置Apache以允许从CGI进行系统调用? 是否必须在本地(.htaccess)或全局(/ etc / apache2 / ...)进行这样的配置? 有关如何解决此问题的任何建议? 任何帮助表示赞赏。

显然发生这种情况是因为子进程产生了输出,该输出没有按应有的方式通过调用程序的stdout进行管道传输,而是直接刷新到输出。 因此,实际上, ls的输出最终作为CGI头,因此出现500错误。

os.popen起作用了,因为它为您完成了预期的标准输出管道。

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

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

(注意:与原始subprocess.check_call不同,该子进程现在正在异步运行。如果需要同步调用(例如,需要subprocess.check_call的输出...),则可以执行以下操作

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM