Канал подпроцесса прерывается только при запуске скрипта - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь протестировать небольшое серверное приложение с использованием 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).

1 Ответ

0 голосов
/ 09 июля 2019

Мне удалось заставить это работать только сейчас из сценария ... хотя я не пробовал в интерпретаторе:

#! /usr/bin/python3
from subprocess import Popen, PIPE


netcat = "nc 127.0.0.1 9999"

p = Popen(netcat, shell=True, stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input=b'hi dude')[0]

Как примечание ... Я нахожусь в локальной петле ... у одного из 2 оболочек есть это:

netcat -l -p 9999

Другая оболочка использовалась для запуска скрипта python. В оригинальной оболочке, которая слушает, было напечатано «привет, чувак». ОС Ubuntu 18.04. Я могу ошибаться, но я думаю, что вы должны использовать connect (), если вы используете модуль подпроцесса. Также, как еще одно замечание, nc и netcat являются взаимозаменяемыми / одинаковыми исполняемыми файлами. Слушатель использовал 'netcat', в то время как скрипт имеет 'nc'.

shell1

shell2

...