subprocess.Popen工作吗?

时间:2012-08-10 23:22:27

标签: python subprocess popen

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

2 个答案:

答案 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()