Python и входной трубопровод подпроцесса - PullRequest
1 голос
/ 02 ноября 2010

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

1) Версия, которая позволяет пользователю вводить команды в windoe терминала, и они будут отправляться на вход менеджера сервера так же, как команда «save-all».

2) Версия, которая продолжает работать, но отправляет любые новые данные в саму систему, устраняя необходимость во втором окне терминала. Это на самом деле наполовину происходит сейчас, так как когда что-то набирается, визуальной обратной связи нет, но как только программа заканчивается, становится ясно, что терминал получил ввод. Например, список содержимого каталога будет там, если «dir» был введен во время работы программы. Это больше для понимания, чем для практичности.

Спасибо за помощь. Вот сценарий:

from time import sleep
import sys,os
import subprocess


#  Launches the server with specified parameters, waits however
#  long is specified in saveInterval, then saves the map.


#  Edit the value after "saveInterval =" to desired number of minutes.
#  Default is 30

saveInterval = 30

#  Start the server.  Substitute the launch command with whatever you please.
p = subprocess.Popen('java -Xmx1024M -Xms1024M -jar minecraft_server.jar',
                     shell=False,
                     stdin=subprocess.PIPE);

while(True):

    sleep(saveInterval*60)

    #  Comment out these two lines if you want the save to happen silently.
    p.stdin.write("say Backing up map...\n")
    p.stdin.flush()

    #  Stop all other saves to prevent corruption.
    p.stdin.write("save-off\n")
    p.stdin.flush()
    sleep(1)

    #  Perform save
    p.stdin.write("save-all\n")
    p.stdin.flush()
    sleep(10)

    #  Allow other saves again.
    p.stdin.write("save-on\n")
    p.stdin.flush()

Ответы [ 3 ]

2 голосов
/ 02 ноября 2010

Замените ваш sleep() вызовом select((sys.stdin, ), (), (), saveInterval*60) - он будет иметь то же время ожидания, но прослушивает стандартный ввод пользовательских команд.Когда select говорит, что у вас есть ввод, прочитайте строку из sys.stdin и передайте ее вашему процессу.Когда select указывает на тайм-аут, выполните команду «сохранить», которую вы сейчас делаете.

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

Вы можете запустить программу с помощью screen, затем вы можете отправить входные данные в конкретный сеанс экрана, а не непосредственно в программу (если вы используете Windows, просто установите cygwin).

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

Это не полностью решит вашу проблему, но вы можете найти полезным модуль Python cmd . Это способ легко реализовать расширяемый цикл командной строки (часто называемый REPL).

...