Python和子流程输入管道
我有一个小脚本,它每半小时启动一次,向java程序游戏服务器管理器发送一个命令,就好像用户正在键入它一样。然而,在阅读文档和进行实验之后,我不知道如何获得两件事: 1允许用户在终端windoe中键入命令的版本,这些命令将被发送到服务器管理器输入,就像保存所有命令一样 2保持运行,但向系统本身发送任何新输入的版本,无需第二个终端窗口。这一次实际上一半发生在现在,因为当输入内容时,没有视觉反馈,但一旦程序结束,很明显终端已经收到了输入。例如,如果在程序运行时键入了dir,目录内容列表就会出现。这一条更多的是为了理解而不是实用性 谢谢你的帮助。以下是脚本:Python和子流程输入管道,python,pipe,subprocess,popen,Python,Pipe,Subprocess,Popen,我有一个小脚本,它每半小时启动一次,向java程序游戏服务器管理器发送一个命令,就好像用户正在键入它一样。然而,在阅读文档和进行实验之后,我不知道如何获得两件事: 1允许用户在终端windoe中键入命令的版本,这些命令将被发送到服务器管理器输入,就像保存所有命令一样 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()
它不会完全解决您的问题,但您可能会发现python的模块很有用。这是一种容易实现可扩展命令行循环(通常称为REPL)的方法。它不会完全解决您的问题,但您可能会发现python的模块很有用。这是一种容易实现可扩展命令行循环(通常称为REPL)的方法。您可以使用screen运行程序,然后您可以将输入发送到特定的screen会话,而不是直接发送到程序(如果您在Windows中,只需安装cygwin)。您可以使用screen运行程序,然后,如果您在Windows中,则可以将输入发送到特定的屏幕会话,而不是直接发送到程序。只需安装cygwin。将睡眠替换为调用-该调用将具有相同的超时,但会在stdin上侦听用户命令。当select表示您有输入时,从sys.stdin中读取一行并将其输入到您的流程中。当select指示超时时,执行您现在正在执行的save命令。将您的睡眠替换为对-的调用,该调用将具有相同的超时,但会在stdin上侦听用户命令。当select表示您有输入时,从sys.stdin中读取一行并将其输入到您的流程中。当select指示超时时,执行您现在正在执行的save命令。太棒了,我没听说过这个。谢谢。作为一个警告-你没有提到你在什么平台上-select可能无法在win32上正常工作。我只熟悉*尼克斯。太棒了,我没听说过这个。谢谢。作为一个警告-你没有提到你在什么平台上-select可能无法在win32上正常工作。我只熟悉*nix。我可以尝试重新构造一下,在这种情况下,cmd可能非常有用。谢谢你的建议。我可以尝试重新构造一下,在这种情况下,cmd可能真的很有用。谢谢你的建议。