0

测试1.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()]

测试2.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 中),我都会得到相同的输出。出事了。我也尝试读取输出,所以我至少可以告诉它正在读取文件。但是我没有输出。这里出了什么问题?

4

2 回答 2

2

您的第二个脚本 (test2.py) 只定义了一个application函数——它不调用该函数,因此当您运行该脚本时不会发生任何可见的事情。

于 2012-08-10T23:32:48.263 回答
1

为了扩展@duskwuff 已经给出的答案......是的,子进程正在正常工作。

问题是test2.py脚本几乎立即成功完成,因为从命令 shell 调用它会运行脚本,但脚本没有入口点。并且没有办法以您使用它的方式运行它。test2.py是一个 wsgi 应用程序,旨在以等待连接进入的方式运行,然后通过您的application可调用对象传递请求。

test2.py需要实际做一些事情,可以从命令行执行:

import time

def main():
    time.sleep(5)
    print "All done"

if __name__ == "__main__":
    main()
于 2012-08-11T00:19:20.203 回答