要了解问题发生的原因,请尝试启动脚本
python webls.py > output
而且比开output
用一些文本编辑器。你会注意到你的Content-type: text/html
最终位于文件的底部,这当然是错误的。
发生这种情况是因为合并了你的输出os.system
Python 代码的输出把事情搞砸了(因为想一想:你的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