Python CGI os.system 导致标头格式错误

2023-12-24

我正在运行 Apache/2.4.10 (Raspbian) 并且我正在使用 python 作为 CGI。 但是当我尝试在简单代码中使用 os.system 时,我收到此格式错误的标头错误:

[Wed Aug 31 17:10:05.715740 2016] [cgid:error] [pid 3103:tid 1929376816] [client 192.168.0.106:59277] malformed header from script'play.cgi': Bad header: code.cgi

这是来自 play.cgi 的代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cgi
import os

print('Content-type: text/html')
print('')

os.system('ls')

奇怪的是,如果我删除 os.system 行,它会神秘地再次开始工作。我尝试使用 popen 代替,同样的问题。我试图在一些代码中掩盖它,更改文件名,不同的编码,甚至 time.sleep,但这些都不起作用。

最奇怪的是它在更复杂的代码中工作得很好。


要了解问题发生的原因,请尝试启动脚本

python webls.py > output

而且比开output用一些文本编辑器。你会注意到你的Content-type: text/html最终位于文件的底部,这当然是错误的。

发生这种情况是因为合并了你的输出os.systemPython 代码的输出把事情搞砸了(因为想一想:你的print(...)在适当的时候以块的形式累积和刷新,同时os.system()突然打印数据,因为它是os.system事务,仅闪烁其结果(这也是如果输出到控制台则看不到问题的原因)。解决方案是在打印标题后刷新输出。你应该将你的代码更改为

#!/usr/bin/python

import cgi
import os
import sys

print 'Content-type: text/html'
print ''

sys.stdout.flush()

os.system('ls')

尽管这是一个修复,但如果您需要将控制台命令的输出合并到网页的内容中并使用,您知道您正在做一些非常错误的事情os.system为了那个原因。您应该考虑做几件事。这些解决方案按推荐程度排序(从糟糕到良好):

- 使用输入/输出重定向。保存输出ls在 Python 代码中归档并读取它:

os.system('ls > /tmp/lsoutput')
print open('/tmp/lsoutput', 'r').read()

-使用子进程。它允许您捕获控制台程序的输出并在 python 代码中使用它(示例来自python getoutput() 在子进程中等效 https://stackoverflow.com/questions/6657690/python-getoutput-equivalent-in-subprocess)

import subprocess
process = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE)
out, err = process.communicate()
print(out)

- 根本不要调用外部程序,这是一件坏事。如果需要文件列表,请使用 Python 函数

import os

for filename in os.listdir('.'):
    print filename
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python CGI os.system 导致标头格式错误 的相关文章

随机推荐

  • 如何在 Angular 中获取 DOM 节点属性

    我在用这个答案 https stackoverflow com a 35385518 10684507将 HTML 字符串转换为 Angular 中的 DOM 元素 问题是我无法获取属性Node getAttribute 无法使用 因为打字
  • 根据出生日期计算年龄(jQuery 或 PHP)[不基于用户输入]

    我正在寻找一个 JavaScript 或 PHP 脚本 可以让我根据某人的出生日期来计算他 她的年龄mm dd yyyy格式 我发现这个非常有用的链接 在 JavaScript 中计算年龄 https stackoverflow com q
  • swagger codegen 正在覆盖生成文件中的自定义代码

    我使用 swagger codegen 生成 jaxrs 服务器端类和客户端 java 类 这是我用来生成类的命令 java jar modules swagger codegen distribution target swagger c
  • 如何使用 Google 托管的 jQuery UI 源?

    我需要加载 jQuery UI 文件 并且想从 Google 执行此操作 目前我上传 我需要从 Google 获取哪些相应文件 我可以用吗http ajax
  • 检测 NSDictionary 中的 Null 值

    我有一个NSDictionary它是由 API 服务器的 JSON 响应填充的 有时该字典中键的值是Null 我试图获取给定的值并将其放入表格单元格的详细文本中进行显示 问题是 当我尝试将值强制转换为NSString我发生了车祸 我thin
  • R中有没有办法告诉某个纬度/经度坐标属于哪个大陆?

    我正在使用maps在 R 中打包 并希望在每个大陆上制作一个文本标签 说明我正在绘制的点有多少个在每个大陆上 虽然我可以制作粗略的方框来勾勒出每个大陆的轮廓 但它们并不那么准确 例如 有时包括欧洲 非洲的部分地区等 R 中是否有一些功能可以
  • Java 中的异常翻译与异常链接

    有什么区别Exception Translation and Exception Chaining在Java中 根据约书亚 布洛赫 in 有效的Java 异常翻译较高层应捕获较低级别的异常 并在其位置抛出可以用以下方式解释的异常 更高层次的
  • 在使用curses的Python程序中,Setupterm找不到终端

    我正在尝试使用Python 使用PyCharm 2 0 运行一个简单的curses脚本 这是我的脚本 import curses stdscr curses initscr curses noecho curses cbreak stdsc
  • 自定义 matplotlib 图:带有彩色单元格的棋盘式表格

    当我学习 python 和这个有趣的绘图库时 我开始使用 matplotlib 渲染绘图 我需要帮助解决我正在解决的问题的自定义绘图 可能已经有一个内置函数可以实现此目的 问题 我正在尝试绘制一个表格 矩形 作为包含 96 个单独单元格 8
  • WebGL 如何避免长时间着色器编译导致选项卡停顿

    我有一个巨大的着色器 需要一分多钟的时间来编译 在这个过程中完全停止了整个浏览器 据我所知 着色器编译不能异步 因此您可以在等待编译完成时运行其他 WebGL 命令 我已经尝试过以下操作 在一段时间内不要使用该特定着色器 这不起作用 因为大
  • 如何以编程方式将 css 类应用到 asp.net 控件?

    我想知道如何通过 C 后端将 CSS 类应用到 ASP NET 控件 本例中为 TextBox 例如
  • 如何将 int[] 连接到 .NET 中的字符分隔字符串?

    我有一个整数数组 int number new int 2 3 6 7 将它们转换为单个字符串的最简单方法是什么 其中数字由字符分隔 例如 2 3 6 7 我正在使用 C 和 NET 3 5 var ints new int 1 2 3 4
  • Angular:$http 请求给出 -1 状态

    Node js 服务器给出 这是一个字符串 写头 写 字符串 结束 当执行 http 请求时 我看到 Node js 服务器正在响应并发回信息 在 Angular 中我执行以下请求 angular module phoneList comp
  • JavaScript 查询选择器全部

    我正在编写的教程包含以下代码和以下注释 我不明白 i 评论 特别是为什么它说 所有第二个表格单元格 第二 是什么意思 这不是正确的英语 ii 当它说的时候 它到底在寻找什么td td 该程序是关于从表中获取数据 所以td td选择 html
  • JPA 多重联接

    我有这些课程 class Project ManyToOne Company owner ManyToMany Set
  • 光滑的滑块转到第一张幻灯片

    Slick 滑块设置为自动播放 播放时 幻灯片从左到右或从第一个到最后一个 当滑块到达最后一张幻灯片时 它将开始从最后一张幻灯片向后自动播放到第一张幻灯片 我希望当滑块到达最后一张幻灯片时 滑块从第一张幻灯片开始播放 而不是从最后一张幻灯片
  • 如何使用 sqlcmd 运行 sql 脚本文件并输出到 shell 和文件

    我正在尝试使用以下命令从文件运行 sql 脚本sqlcmd 使用以下命令 sqlcmd S
  • Ruby 中 $stdout 和 STDOUT 之间的区别

    在 Ruby 中 有什么区别 stdout 前面有美元符号 和STDOUT 全部大写 在进行输出重定向时 应该使用哪个以及为什么 同样适用于 stderr and STDERR Edit 刚刚找到一个相关问题 https stackover
  • 该结构的初始序列是什么?

    我遇到了最初的序列概念 通过标准搜索initial sequence短语只给出 3 个结果 并且没有给出定义 Section N3797 9 5 1 class union 如果标准布局联合包含多个标准布局结构 有着共同点的初始序列 9 2
  • Python CGI os.system 导致标头格式错误

    我正在运行 Apache 2 4 10 Raspbian 并且我正在使用 python 作为 CGI 但是当我尝试在简单代码中使用 os system 时 我收到此格式错误的标头错误 Wed Aug 31 17 10 05 715740 2