Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和子流程输入管道_Python_Pipe_Subprocess_Popen - Fatal编程技术网

Python和子流程输入管道

Python和子流程输入管道,python,pipe,subprocess,popen,Python,Pipe,Subprocess,Popen,我有一个小脚本,它每半小时启动一次,向java程序游戏服务器管理器发送一个命令,就好像用户正在键入它一样。然而,在阅读文档和进行实验之后,我不知道如何获得两件事: 1允许用户在终端windoe中键入命令的版本,这些命令将被发送到服务器管理器输入,就像保存所有命令一样 2保持运行,但向系统本身发送任何新输入的版本,无需第二个终端窗口。这一次实际上一半发生在现在,因为当输入内容时,没有视觉反馈,但一旦程序结束,很明显终端已经收到了输入。例如,如果在程序运行时键入了dir,目录内容列表就会出现。这一条

我有一个小脚本,它每半小时启动一次,向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可能真的很有用。谢谢你的建议。