2016-07-04 7 views
0

subprocess.Popen()의 프로세스에 명령을 전달해야하지만, 수행 할 때 이후에 stdin.close()을 사용하는 경우에만 작동합니다. 내 코드는 아래와 같습니다.subprocess.Popen() 프로세스에 명령 보내기

sprocess.stdin.write('/stop'.encode()) 
sprocess.stdin.flush() 
sprocess.stdin.close() 
sprocess.stdout.close() 

작품을하지만, 그 때문에의 stdin.close() 내가이 파이프를 닫지 않고이 작업을 수행 할 수 있어야합니다.

파이프를 닫지 않고 프로세스에 명령을 전달하려면 어떻게해야합니까?

#!/usr/bin/python3 

import discord 
import asyncio 
from subprocess import Popen, PIPE 

client = discord.Client() 

@client.event 
async def on_ready(): 
    print('Bot ID: '+ client.user.id +'\nREADY\n') 

@client.event 
async def on_message(message): 
    if message.content.startswith('/start'): 
     if message.channel.name == "server-console": 
      await client.send_message(message.channel, '**SERVER STARTING**') 
      print('SERVER STARTING') 
      global sprocess 
      global soutput 
      sprocess = Popen('java -Xmx2048M -Xms2048M -jar minecraft_server.jar', 
             shell=True, 
             stdout=PIPE, 
             stdin=PIPE) 

    elif message.content.startswith('/stop'): 
     if message.channel.name == "server-console": 
      print('SERVER STOPPING') 
      sprocess.stdin.write('/stop'.encode()) 
      sprocess.stdin.flush() 
      sprocess.stdin.close() 
      sprocess.stdout.close() 

    elif message.content.startswith('/restart'): 
     if message.channel.name == "server-console": 
      print('SERVER RESTARTING') 

    elif message.content.startswith('/'): 
     if message.channel.name == "server-console": 
      sprocess.stdin.write(message.clean_content.encode()) 
      sprocess.stdin.flush() 
      print(message.clean_content) 
      print('COMMAND SENT') 

client.run('token') 
+0

'sprocess.stdin.write ('/ stop'.encode())'는 개행을 추가하지 않습니다! 당신의 하위 프로세스는 개행이나 EOF로 표시되는 * line * 입력을 기대하고있을 것입니다. 'stdin'을 닫으면 그 EOF를 보냅니다. 대신'sprocess.stdin.write ('/ stop \ n'.encode())'를 보내보십시오. – MisterMiyagi

+0

@MisterMiyagi 그 대답을 받아 들일 수있게 해주시겠습니까? – spikespaz

답변

1

개행을 추가하지 않습니다. 귀하의 하위 프로세스는 아마도 라인의 입력을 기대하고 있습니다. 줄 바꿈 또는 EOF로 나타냅니다. stdin을 닫으면 해당 EOF를 보냅니다.

대신 sprocess.stdin.write('/stop\n'.encode())을 보내보십시오.