2017-09-28 11 views
0

다른 스크립트 (클라이언트)를 실행하고 특정 시간 이후에 종료 할 파이썬 스크립트 (Activator)를 실행하려고합니다. (이 예제에서는 5 초).파이썬 하위 프로세스에서 실시간으로 Windows 콘솔에서 작동하지 않습니다.

활성제

import random, sys, os, socket 
 
import time, datetime 
 
import subprocess 
 
from threading import Thread 
 
from multiprocessing import Queue 
 

 

 
class deamon_pckg: 
 
    def __init__(self, msg_type, info, exeption=None): 
 
     self.msg_type = msg_type 
 
     self.info = info 
 
     self.exception = exeption 
 

 

 
class Process_comm: 
 
    @staticmethod 
 
    def deamon(process, q): 
 
     while process.poll() is None: 
 
      out = process.stdout.readline().rstrip() 
 
      if out != '': 
 
       d_pckg = deamon_pckg('cmd', out) 
 
       q.put(d_pckg) 
 

 
     exit_code = process.returncode 
 
     if exit_code != 0: 
 
      err_msg = process.stderr.read() 
 
     else: 
 
      err_msg = None 
 
     d_pckg = deamon_pckg('EXIT', exit_code, err_msg) 
 
     q.put(d_pckg) 
 

 
    def __init__(self, process): 
 
     self.process = process 
 
     self.q = Queue() 
 
     self.d = Thread(target=Process_comm.deamon, args=(self.process, self.q)) 
 
     self.d.start() 
 

 
    def close(self): 
 
     if self.process.returncode is None: 
 
      self.terminate() 
 
     self.d.join() 
 

 
    def terminate(self): 
 
     self.process.terminate() 
 

 
    def get(self, blocking=False): 
 
     if blocking: 
 
      return self.q.get() 
 
     else: 
 
      if self.q.empty(): 
 
       return None 
 
      else: 
 
       return self.q.get() 
 

 

 
if __name__ == '__main__': 
 
    print "Activator online" 
 
    start_time = datetime.datetime.now() 
 
    process = subprocess.Popen(['python', "C:\work\Router\src\demiborg.py"], 
 
           stdout=subprocess.PIPE, 
 
           stderr=subprocess.PIPE) 
 
    d = Process_comm(process) 
 

 

 
    while True: 
 
     delta = (datetime.datetime.now() - start_time) 
 
     dpckg = d.get() 
 
     if delta.seconds >= 5: 
 
      d.terminate() 
 
      break 
 
     if dpckg is None: 
 
      time.sleep(0.1) 
 
     else: 
 
      if dpckg.msg_type == 'EXIT': 
 
       print "[{}]\t{}".format(dpckg.msg_type, dpckg.info) 
 
       if dpckg.exception is not None: 
 
        print "{}".format(dpckg.exception) 
 
       break 
 
      else: 
 
       print "[{}]\t{}".format(dpckg.msg_type, dpckg.info) 
 
    d.close()

클라이언트 :

import random, sys, os, socket 
 
import time, datetime 
 

 

 
def get_time_stamp(): 
 
    ts = time.time() 
 
    st = datetime.datetime.fromtimestamp(ts).strftime('%f:%S:%M:%H:%d:%m:%Y') 
 
    return st 
 

 
def put(fout,msg): 
 
    fout.write('[{:>30}]'.format(get_time_stamp()) + '\t' + msg + '\n') 
 
    fout.flush 
 
    print msg 
 

 

 
if __name__ == '__main__': 
 
    fout = open('demiborg.txt','wb') 
 
    put(fout,"Start DemiBorg") 
 
    for i in range(20): 
 
     put(fout,"time - {}".format(i)) 
 
     time.sleep(0.5) 
 

 
    put(fout,'End') 
 
    fout = open('ERROR', 'wb') 
 
    fout.close()

내가 실행하는 경우

,893,210

하지만 난 (클라이언트가 실행되지 않은 것처럼) 내가 전혀 입력을 얻을 윈도우 콘솔을 통해 그것을 실행할 때. A는 클라이언트를 죽이지 않은 경우

더욱 더

C:\work\Router\src>C:\work\Router\src\plygrnd_activator.py 
 
Activator online 
 

 
C:\work\Router\src>

는, 내가 모든 메시지는 클라이언트가 실행을 완료 한 후에 만 ​​함께 하나 개의 블록으로 온 것으로 나타났습니다. 왜 단지 pycharm을 사용하여 잘 작동하지만 콘솔에서 라이브 피드백을 얻지 못합니까? 목적은 콘솔에서 실행하는 것입니다. 감사합니다.

답변

0

해결 방법 : 버퍼 크기에 문제가있었습니다. 사용하는 대신

:

process = subprocess.Popen(['python','-u', "C:\work\Router\src\demiborg.py"], 
 
           stdout=subprocess.PIPE, 
 
           stderr=subprocess.PIPE)

: 내가 "파이썬"후 "-u"플래그를 추가 한

process = subprocess.Popen(['python', "C:\work\Router\src\demiborg.py"], 
 
           stdout=subprocess.PIPE, 
 
           stderr=subprocess.PIPE)