我有一个小脚本启动,并且每半小时将命令提供给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()
答案 0 :(得分:2)
将sleep()
替换为select((sys.stdin, ), (), (), saveInterval*60)
- 将具有相同的超时但是在stdin上侦听用户命令。当select
表示您已输入时,请从sys.stdin中读取一行并将其提供给您的流程。当select
指示超时时,请执行您现在正在执行的“保存”命令。
答案 1 :(得分:1)
它不会完全解决您的问题,但您可能会发现python的cmd模块很有用。这是一种轻松实现可扩展命令行循环(通常称为REPL)的方法。
答案 2 :(得分:1)
您可以使用屏幕运行程序,然后您可以将输入发送到特定的屏幕会话而不是直接发送到程序(如果您在Windows中只是安装cygwin)。