我正在尝试使用subproc和_thread模块运行命令。子过程具有输出流。为了解决这个问题,我使用了两个线程,一个不断地打印新行,另一个正在检查输入。当我通过子过程输入时,proc.stdin.write('Some string')
它返回1,然后没有任何输出。交流不会像我读过的大多数其他问题一样起作用,因为它会阻止等待EOF,尽管它确实会打印要返回的内容的第一行。我看到了一些使用“
pty”的解决方案,但Windows不支持它。
如果您想自己尝试,则服务器文件夹中的文件只是我的世界服务器。
from subprocess import Popen,PIPE
import _thread
import sys
# asdf
proc = None
run = True
stdout = None
stdin = None
def getInput():
global proc
global run, stdin, stdout
print("Proc inside the get input funct"+str(proc))
inputs = input("Enter Something" + "\n")
print("YOU ENTERED:", inputs)
print("ATTEMPTING TO PIPE IT INTO THE CMD")
run = True
"""----------------------------------------"""
""" Works but blocks outputs """
"""----------------------------------------"""
# out,err=proc.communicate(bytes(inputs,'UTF-8'))
# proc.stdin.flush()
# print("Out is: "+out)
"""----------------------------------------"""
""" Doesn't write but doesn't block """
"""----------------------------------------"""
# test = 0
# test=proc.stdin.write(bytes(inputs,'UTF-8'))
# print(test)
# proc.stdin.flush()
def execute(command):
global proc, stdin, stdout
proc = Popen(command, cwd='C://Users//Derek//Desktop//server//',stdin=PIPE,stdout=PIPE,stderr=stdout, shell=True)
lines_iterator = iter(proc.stdout.readline, "")
print("Proc inside of the execute funct:"+str(proc))
# print(lines_iterator)
for line in lines_iterator:
# print(str(line[2:-1]))
# if line.decode('UTF-8') != '':
print(line[:-2].decode('UTF-8')), # yield line
sys.stdout.flush()
threadTwo = _thread.start_new_thread(execute, (["java", "-jar", "minecraft_server.jar"], ))
while 1:
if run and proc!=None:
run = False
threadOne = _thread.start_new_thread(getInput, ( ))
pass
proc.communicate()
等待子进程完成,因此最多只能使用 一次 –您可以 一次 传递 所有 输入,并在子进程退出后获取所有输出。
如果不修改输入/输出,则无需重定向子流程的stdin / stdout。
要将输入馈送到后台线程中的子流程,并在一行一行到达时立即打印其输出:
#!/usr/bin/env python3
import errno
from io import TextIOWrapper
from subprocess import Popen, PIPE
from threading import Thread
def feed(pipe):
while True:
try: # get input
line = input('Enter input for minecraft')
except EOFError:
break # no more input
else:
# ... do something with `line` here
# feed input to pipe
try:
print(line, file=pipe)
except BrokenPipeError:
break # can't write to pipe anymore
except OSError as e:
if e.errno == errno.EINVAL:
break # same as EPIPE on Windows
else:
raise # allow the error to propagate
try:
pipe.close() # inform subprocess -- no more input
except OSError:
pass # ignore
with Popen(["java", "-jar", "minecraft_server.jar"],
cwd=r'C:\Users\Derek\Desktop\server',
stdin=PIPE, stdout=PIPE, bufsize=1) as p, \
TextIOWrapper(p.stdin, encoding='utf-8',
write_through=True, line_buffering=True) as text_input:
Thread(target=feed, args=[text_input], daemon=True).start()
for line in TextIOWrapper(p.stdout, encoding='utf-8'):
# ... do something with `line` here
print(line, end='')
注意事项p.stdin
:
print()
在每个末尾添加一个换行符line
。这是必要的,因为input()
剥离换行符p.stdin.flush()
每行(line_buffering=True
)之后被调用我的世界的输出可能会延迟到刷新其标准输出缓冲区。
如果您在 _“line
在此处执行某些操作”_注释周围没有可添加的内容,请不要重定向相应的管道(暂时忽略字符编码问题)。
TextIOWrapper
默认情况下使用通用换行模式。newline
如果不想,请明确指定参数。
问题内容: 我进行了很多搜索,但找不到任何东西。.我只是想问一下是否有任何方法可以创建和调用不带参数的过程( Informix )。我知道如何返回一个或多个值(用于过程和函数),但这不是我想要的。如果Informix不允许输出参数,那将真的很奇怪。 提前致谢! 编辑 :是的,我看到了可能,但是我仍然无法执行这样的过程。例如: 我收到的是: 常规mytest无法解决 并且仅在执行具有输出参数的功能时
问题内容: 我下面有以下代码示例。你可以在其中输入的命令,即回显结果。但是,先读后。其他输出流不起作用? 为什么会这样或我做错了什么?我的最终目标是创建一个线程计划任务,该任务定期执行对/ bash的命令,因此必须一前一后工作,而不能停止工作。我也一直在经历错误的任何想法? 谢谢。 问题答案: 首先,我建议更换生产线 与线 ProcessBuilder是Java 5中的新增功能,它使运行外部进程更
问题内容: 我正在尝试创建一种控制台/终端,允许用户输入一个字符串,然后将其编入进程并打印出结果。就像普通的控制台一样。但是我在管理输入/输出流时遇到了麻烦。我已经研究了这个线程,但是可悲的是,该解决方案不适用于我的问题。 与标准命令(例如“ ipconfig”和“ cmd.exe”)一起,如果脚本要求输入,我还需要能够运行脚本并使用相同的输入流传递一些参数。 例如,在运行脚本“ python p
问题内容: 在我的父脚本中,我执行以下操作: 在脚本中,我希望大多数日志消息都进入日志文件,但是我希望根据打印条件在控制台上打印一些消息: 但是它正在打印到outfile,我也想在控制台上打印 但这aslso不起作用。任何帮助,将不胜感激! 问题答案: 如果将stdout,stderr重定向,则可以尝试直接打印到控制台: 例:
#include <stdio.h> int main(void) { int i; for (i = 0; i < 100; i++) { printf("i = %d\n", i); } return 0; } 技巧 在gdb中,缺省情况下程序的输入输出是和gdb使用同一个终端。你也可以为程序指定一个单独的输入输出终端。 首先,打开一个新终端,使
问题内容: 我正在使用python脚本作为水动力代码的驱动程序。是时候运行模拟了,我用来运行代码,将和的输出收集到中,然后我可以打印(并保存到日志文件中)输出信息,并检查是否有错误。问题是,我不知道代码是如何进行的。如果我直接从命令行运行它,它将为我提供有关其迭代次数,时间,下一时间步长等的输出。 有没有办法既存储输出(用于日志记录和错误检查),又产生实时流输出? 我的代码的相关部分: 最初,我是