Как я могу выполнить интерактивную оболочку из Jython? - PullRequest
1 голос
/ 29 октября 2011

Мне нужен пример кода Jython или Java для запуска интерактивной оболочки ОС (/ bin / sh). Нашей средой разработки является Java на Linux. Я хотел бы предоставить разработчикам средства для написания сценариев Jython, а затем перейти в оболочку, которая позволяет им проверять систему. Причина, по которой мне нужно выполнить это из Jython или Java - вместо того, чтобы просто обернуть все это в сценарий оболочки - заключается в том, что мы используем Java, загружая некоторые библиотеки, которые мне нужно сохранять загруженными во время работы интерактивной оболочки. Если JVM завершит работу до запуска интерактивной оболочки, некоторые из наших пользовательских аппаратных средств будут сброшены.

Я посмотрел на модуль подпроцесса Jython. Тем не менее, большинство из того, что я видел, будет только запускаться и ждать завершения подпроцесса (т.е. неинтерактивного). Ни один из примеров не показывает, как оболочка может быть вызвана в интерактивном режиме. То же самое относится к большинству примеров Java java.lang.Runtime.exec (), которые я видел.

1 Ответ

2 голосов
/ 29 октября 2011

Что не так с этим простым jython-кодом, так это то, что stdin, stdout не работают так, как мы ожидаем

import subprocess
import os          
subprocess.call([os.environ.get('SHELL', '/bin/sh'), '-i'])

Предполагая, что мы хотим порождать оболочку на tty, кажется, что следующее дать лучшие результаты:

import os
import subprocess

subprocess.call([os.environ.get('SHELL', '/bin/sh') +
    ' -i < /dev/tty > /dev/tty 2>&1'], shell=True)

Это запустит оболочку внутри другой подоболочки, которая заменит поврежденные потоки stdin, stdout на активный tty.

...