Python, работает серверы командной строки - они не слушают должным образом - PullRequest
1 голос
/ 01 июня 2010

Я пытаюсь запустить серверное приложение (в erlang, открывает порты и прослушивает http-запросы) через командную строку, используя pexpect (или даже напрямую, используя subprocess.Popen ()).

приложение запускается нормально, журналы (через pexpect) на экране нормально, я тоже могу взаимодействовать с ним через командную строку ...
проблема в том, что серверы не будут прослушивать входящие запросы. Приложение слушает, когда я запускаю его вручную, вводя команды в командной строке. использование subprocess / pexpect не позволяет приложению каким-либо образом прослушивать ...
когда я запускаю его вручную, «netstat -tlp» отображает приложение как прослушивающее, когда я запускаю его через python (subprocess / pexpect), netstat не регистрирует приложение ...

У меня такое ощущение, что это как-то связано с environemnt, тем, как python разветвляет вещи и т. Д. Есть идеи?

спасибо

базовый пример: Примечание:
"-pz" - только реклама ./ebin к пути модулей для виртуальной машины erl, путь поиска библиотеки
"-run" - запускает moduleName без каких-либо параметров.

command_str = "erl -pz ./ebin -run moduleName"  
child = pexpect.spawn(command_str)  
child.interact() # Give control of the child to the user

все это работает правильно, что странно. У меня есть вход в мой код и все сообщения журнала выводятся, как они должны. сервер не будет прослушивать, даже если я запустил его процесс с помощью bash-скрипта, поэтому я не думаю, что это вызывает код на python (поэтому у меня такое ощущение, что это что-то относительно того, как запускается новый процесс ОС).

1 Ответ

0 голосов
/ 01 июня 2010

Это может быть связано с тем, как аргументы командной строки передаются в подпроцесс.

Без более конкретного кода я не могу сказать наверняка, но у меня была эта проблема при работе с sshsplit (https://launchpad.net/sshsplit)

Чтобы правильно передать аргументы (в этом примере «ssh -ND 3000»), вы должны использовать что-то вроде этого:

openargs = ["ssh", "-ND", "3000"]
print "Launching %s" %(" ".join(openargs))
p = subprocess.Popen(openargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Это не только позволит вам точно увидеть, какую команду вы запускаете, но и должно правильно передать значения в исполняемый файл. Хотя я не могу сказать наверняка, не увидев некоторый код, это кажется наиболее вероятной причиной сбоя (может ли также быть, что программе требуется определенный рабочий каталог или файл конфигурации?).

...