我寫了一個小型Django應用程序,它根據用戶輸入執行交互式程序並將結果作爲結果返回。但由於某種原因,子進程掛起。在對日誌進行驗證時,我發現一個'\ n'必須作爲應對挑戰的地方,似乎從未做出迴應。有趣的是,如果我從Django之外運行相同的代碼,即從python模塊或交互式shell運行,子流程可以毫無困難地工作。我假設Django使用的環境中的一些設置是這裏的罪魁禍首。這裏是我寫的代碼片段:Subprocess.Popen在Django內部調用時會掛起交互式程序
def runtests(test_name, selective=False, tests_file=''):
if selective:
run_cmd = ['runtest', '--runfromfile', tests_file, test_name]
else:
run_cmd = 'runtest %s' % (test_name)
print 'Executing command .. '
print run_cmd
p = subprocess.Popen(run_cmd, shell=False, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
return p.stdout.read()
def result(request):
test_name = request.GET['test_name']
if not test_name:
return render_to_response('webrun/execute.html', {'error_flag':True})
in_file = os.path.abspath('webrun/log/%s_in.xml' % test_name)
suites = dict([(field[len('suite_'):],value)
for field,value in request.GET.items()
if field.startswith('suite_')])
if suites:
_from_dict_to_xml(suites, in_file, test_name)
output = runtests(test_name, bool(suites), in_file)
return render_to_response('webrun/result.html', {'output':output})
我試着用舊的os.system方法替換子進程。但即使如此,它們仍處於完全相同的地方。同樣,如果我從Django執行相同的代碼,這也會運行。
你是什麼意思的互動?子處理的runtest程序是否需要輸入它的stdin?我只看到你用一些命令行參數運行它。 – Mark 2010-08-06 13:54:08
你是如何運行django的? 'runserver'? 'modpython'? 'wsgi'? – MattH 2010-08-06 14:45:18
@Mark感謝您的回覆。我想我對互動的使用並不是真的正確。實際上,runtest程序會在網絡中打開一個帶有設備的外殼,並通過響應設備給出的提示進行交互。用戶沒有這樣的交互。 @MattH感謝repsonse。我目前正在使用Django的開發服務器。 – sdzk 2010-08-06 15:07:11