Запуск программы Jython из Python с использованием модуля подпроцесса? - PullRequest
4 голосов
/ 09 ноября 2010

У меня есть сценарий jython-сервера (называемый rajant_server.py), который взаимодействует с файлом Java-API для связи по специальным сетевым радиостанциям. У меня есть программа на Python, которая действует как клиент (и делает несколько других вещей). В настоящее время я должен сначала запустить сервер, открыв окно командной строки / терминала и набрав:

cd [path to directory containing rajant_server.py
jython rajant_server.py

Как только сервер успешно подключается, он ждет клиента, который я запускаю, запустив:

cd [path to directory containing python client program]
python main.py

Когда клиент подключается, сервер печатает информацию (в настоящее время для отладки) в своем окне команд / терминалов, а клиентская программа выводит отладочную информацию в своем окне команд / терминалов. Я хочу покончить со сложным процессом, вызвав jython из моей программы main.py с помощью модуля подпроцесса.

Проблема в два раза:

1 - мне нужно, чтобы программа rajant_server.py открывалась в собственном окне терминала / команды

2 - jython нужно запускать в каталоге, где хранится файл rajant_server.py, другими словами, ввод следующего в команду / окно терминала не работает (не спрашивайте меня, почему):

jython C:/code_dir/comm/server/rajant_server.py

но:

cd C:/code_dir/comm/server
jython rajant_server.py

работает.


Ладно ... Мне только что надо работать. Это кажется чем-то вроде взлома, поэтому я все равно хотел бы, чтобы идеи были лучше. Вот что я сейчас делаю:

serverfile = r'rajant_server_v2.py'
serverpath = os.path.join(os.path.realpath('.'),'Comm',serverfile)
serverpath = os.path.normpath(serverpath)
[path,file] = os.path.split(serverpath)

command = '/C jython '+file+'\n'
savedir = os.getcwd()
os.chdir(path)
rajantserver = subprocess.Popen(["cmd",command],\
        creationflags = subprocess.CREATE_NEW_CONSOLE)

#Change Directory back
os.chdir(savedir)
#Start Client
rajant = rajant_comm.rajant_comm()
rajant.start()

Если у вас есть решение, которое будет работать как в Linux, так и в Windows, вы будете моим героем. По какой-то причине я не смог изменить спецификации stdin или stdout для подпроцесса, когда я добавил creationflags = subprocess.CREATE_NEW_CONSOLE.

1 Ответ

1 голос
/ 11 ноября 2010

Функция Popen в подпроцессе принимает необязательный параметр 'cwd', чтобы определить текущий рабочий каталог дочернего процесса.

rajantserver = subprocess.Popen(["cmd",command],\
        creationflags = subprocess.CREATE_NEW_CONSOLE,\
        cwd = path)

Вы можете избавиться от вызова os.getcwd и двух ос.chdir называет это так.Если вы хотите использовать этот сценарий в Linux, вам нужно обойтись без 'cmd'.Поэтому вызовите Popen с ["jython", file] в качестве первого аргумента.

EDIT: я только что видел, что CREATE_NEW_CONSOLE не определен в модуле подпроцесса при работе в Linux.Используйте это:

creationflags = getattr(subprocess,"CREATE_NEW_CONSOLE",0),\

Это будет то же самое, что и раньше, за исключением того, что оно возвращается к значению по умолчанию 0, когда модуль подпроцесса не определяет CREATE_NEW_CONSOLE.

...