Подпроцесс Python 2.7 Popen возвращает None - PullRequest
0 голосов
/ 05 июня 2018

В настоящее время я работаю над набором интеграционных тестов с pytest в python 2.7, которые выполняют следующее:

1) запускает двоичный файл сервера в фоновом режиме на моей локальной машине

2)отправлять запросы на сервер и проверять результаты

3) завершать фоновый серверный процесс

Кажется, все работает нормально, за исключением того, что я не могу остановить серверный процесс, запущенный на моем компьютере.Хотя он продолжает работать на моем компьютере, Python, похоже, забыл об этом;мой Popen объект - None.

AttributeError: 'NoneType' object has no attribute 'terminate'

Есть какие-нибудь мысли о том, что вызывает это?Я что-то упускаю из виду?

import time
import subprocess

server_background_process_pipe = None

def setup_module():
    # Start the test server in the background
    cmd = 'bin/my_server --key1='+value1+' --key2='+value2+' &' # The '&' tells my bin to run in the background
    server_background_process_pipe = subprocess.Popen(cmd, shell=True,stderr=subprocess.STDOUT)
    print(server_background_process_pipe) # prints '<subprocess.Popen object at 0x10aabd250>'
    time.sleep(1) # Wait for the server to be ready

def test_basic_get_request():
    print(server_background_process_pipe) # prints 'None'
    response = send_request_to_server() 
    fail_if_not_as_expected(response) # Response is exactly as expected

def teardown_module():
    # kill the server that was launched in setup_module to serve requests in the tests
    # AttributeError: 'NoneType' object has no attribute 'terminate'
    server_background_process_pipe.terminate()

Дополнительная информация:

Это None, даже если процесс на сервере все еще выполняется.Это None во время выполнения тестов.Он запускается долго после окончания тестирования.Если я повторно запускаю тесты, я получаю сообщение в консоли, что мой сервер не удалось развернуть, потому что он уже запущен.Тесты все еще проходят, потому что они отправляют запросы на сервер из предыдущего выполнения.

Поскольку сервер должен работать в фоновом режиме, я использую конструктор subprocess.Popen напрямую вместо одного из вспомогательных методов, таких как check_output.

1 Ответ

0 голосов
/ 05 июня 2018

In

def setup_module():
    …
    server_background_process_pipe = subprocess.Popen(…)

server_background_process_pipe является локальной переменной.Он никогда не назначается глобальному server_background_process_pipe, поэтому глобальный server_background_process_pipe всегда None, а код

def teardown_module():
    server_background_process_pipe.terminate()

пытается получить атрибут terminate от None.

То, что вы хотите, эточтобы сделать начальное присвоение глобальной переменной:

def setup_module():
    …
    global server_background_process_pipe
    server_background_process_pipe = subprocess.Popen(…)
...