Я пытаюсь протестировать небольшое серверное приложение с использованием Python.Приложение работает как удаленная оболочка - оно принимает входные данные и выводит некоторые данные на основе входных данных.
Моя первоначальная попытка выглядит следующим образом:
#!/usr/bin/python3
import subprocess
nc = subprocess.Popen(['/usr/bin/ncat','127.0.0.1','9999'], stdin =
subprocess.PIPE, stdout = subprocess.PIPE)
nc.stdin.write(b'test')
Это не такработать и говорит мне:
write: Broken pipe
Однако, когда я проверяю это в интерактивном интерпретаторе python3, все, кажется, работает просто отлично:
$ /usr/bin/python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> nc = subprocess.Popen(['ncat','127.0.0.1','9999'], stdin = subprocess.PIPE, stdout = subprocess.PIPE)
>>> nc.stdin.write(b'test')
4
Когда я запускаю ncat в оболочкеон также ожидает ввода, как и ожидалось.
Так что же происходит?Чем интерактивный интерпретатор отличается от запуска сценария и почему он влияет на подпроцессы?
Некоторые примечания:
- Я не хочу использовать сокеты самостоятельно.Сервер, который я тестирую, запускается через xinetd, что означает, что исполняемый файл также можно протестировать, запустив его напрямую.С текущим решением я мог бы изменить
['/usr/bin/ncat','127.0.0.1','9999']
на ['./server_executable']
и протестировать все без промежуточной сети.С сокетами я бы потерял эту функциональность. - Я знаю о pexpect и даже думаю об его использовании.Даже если я в конечном итоге не использую подпроцессы, я бы хотел знать, что, черт возьми, здесь происходит.
- Когда я предоставляю исполняемый файл сервера для Popen, все работает отлично.Это может указывать на то, что есть какая-то проблема с ncat и как он работает (не знаю, насколько это актуально, но я использую ncat версии 7.40).