0

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)(test2.py で) 0 秒または 30 秒に設定しても、同じ出力が得られます。何かが起きています。また、出力を読み込もうとしたので、少なくともファイルを読み込んでいることがわかりました。しかし、出力が得られません。ここで何がうまくいかないのですか?

4

2 に答える 2

2

2 番目のスクリプト (test2.py) は関数を定義するだけapplicationです。その関数は呼び出されないため、スクリプトを実行しても何も表示されません。

于 2012-08-10T23:32:48.263 に答える
1

@duskwuffによってすでに与えられた答えを拡張するには...はい、サブプロセスは正常に機能しています。

問題はtest2.py、コマンド シェルからスクリプトを呼び出すとスクリプトが実行されるため、スクリプトがほぼ瞬時に正常に完了することですが、スクリプトにはエントリ ポイントがありません。そして、これを使用している方法でこれを実行する方法はありません。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 に答える