#python #google-app-engine
#python #google-app-engine
Вопрос:
Я пытаюсь написать скрипт на Python, который позволит мне запустить Google App Engine dev_appserver с помощью coverage.py извлеките URL-адрес / test из приложения, которое я запускаю, дождитесь, пока сервер завершит возврат страницы, затем выключите dev_appserver, а затем сгенерируйте отчет.
Моя задача заключается в том, как запустить dev_appserver в фоновом режиме, чтобы я мог выполнять выборку http, а затем как отключить dev_appserver перед созданием моего отчета.
Я направляюсь к чему-то вроде этого:
# get_gae_coverage.py
# Launch dev_appserver with coverge.py
coverage run --source=./ /usr/local/bin/dev_appserver.py --clear_datastore --use_sqlite .
#Fetch /test
urllib.urlopen('http://localhost:8080/test').read()
# Shutdown dev_appserver somehow
# ??
# Generate coverage report
coverage report
Какой наилучший способ написать скрипт на Python для этого?
Ответ №1:
Вы должны использовать подпроцесс Popen
import os
import signal
import subprocess
coverage_proc = subprocess.Popen(
['coverage','run', your_flag_list]
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
time.sleep(5) #Find the correct sleep value
urllib.urlopen('http://localhost:8080/test').read()
time.sleep(1)
os.kill(coverage_proc.pid, signal.SIGINT)
Здесь вы можете найти другой подход для проверки работоспособности сервера:
line = proc.stdout.readline()
while '] Running application' not in line:
line = proc.stdout.readline()
Ответ №2:
threading
это способ выполнить такого рода задачу. А именно, вы запускаете dev_appserver в потоке или в главном потоке и во время его выполнения запускаете и собираете результаты с помощью модуля coverage, а затем завершаете процесс dev_appserver python в другом потоке, и вы получите результаты от coverage.
Вот пример фрагмента, который запускает dev_appserver.py
в потоке, а затем ожидает 10 секунд, прежде чем завершит процесс Python. Вы можете изменить метод end подходящим образом, в котором вместо ожидания 10 секунд он ожидает несколько секунд (для того, чтобы запустить процесс python), а затем начать тестирование покрытия и после его завершения отключить appserver и завершить покрытие.
import threading
import subprocess
import time
hold_process = []
def start():
print 'In the start process'
proc = subprocess.Popen(['/usr/bin/python','dev_appserver.py','yourapp'])
hold_process.append(proc)
def end():
time.sleep(10)
proc = hold_process.pop(0)
print 'Killing the appserver process'
proc.kill()
t = threading.Thread(name='startprocess',target=start)
t.deamon = True
w = threading.Thread(name='endprocess',target=end)
t.start()
w.start()
t.join()
w.join()
Комментарии:
1. операционная система пытается запустить dev_appserver с запуском покрытия.
2. @systempuntout — да, я понял. если я правильно понимаю. Вы запускаете dev_appserver в одном потоке, а затем запускаете покрытие в другом потоке, а затем координируете, правильно? Это был мой ответ.