test1.py
import cStringIO
import os
import cgi
import time
import sys
from subprocess import Popen, PIPE, STDOUT
def application(environ, start_response):
headers = []
headers.append(('Content-Type', 'text/plain'))
write = start_response('200 OK', headers)
input = environ['wsgi.input']
output = cStringIO.StringIO()
process = Popen(["python","C:/wamp/www/python/popen/test2.py"], stdout=PIPE, stderr=PIPE)
a = 0
while a < 10:
a += 1
print >> output, "%r" % process.returncode
print >> output, "%r" % process.poll()
print >> output
time.sleep(1)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
print >> output, "Output: "+out
output.write(input.read(int(environ.get('CONTENT_LENGTH', '0'))))
return [output.getvalue()]
test2.py
import cStringIO
import os
import cgi
import time
def application(environ, start_response):
headers = []
headers.append(('Content-Type', 'text/plain'))
write = start_response('200 OK', headers)
input = environ['wsgi.input']
output = cStringIO.StringIO()
time.sleep(15)
print >> output, "done"
output.write(input.read(int(environ.get('CONTENT_LENGTH', '0'))))
return [output.getvalue()]
test1.py输出
None
None
None
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Output:
无论我将time.sleep(15)
设置为0秒还是30(在test2.py中),我都会获得相同的输出。有些事情发生了。我也尝试读取输出,所以我至少可以告诉它正在读取文件。但我没有输出。这里出了什么问题?
答案 0 :(得分:2)
您的第二个脚本(test2.py)只定义了一个application
函数 - 它不会调用该函数,因此在运行脚本时不会发生任何可见的事情。
答案 1 :(得分:1)
扩展@duskwuff已经给出的答案......是的,子进程正在按预期工作。
问题是test2.py
脚本几乎立即成功完成,因为从命令shell调用它会运行脚本,但脚本没有入口点。并且没有办法以你正在使用它的方式运行它。 test2.py
是一个wsgi应用程序,旨在以等待连接进入的方式运行,然后通过application
callable传递请求。
test2.py
需要实际做的事情,可以从命令行执行:
import time
def main():
time.sleep(5)
print "All done"
if __name__ == "__main__":
main()