2016-03-30 2 views
0

У меня есть простая запись в файл кода, (one.py)Python: простой прогресс бар на подпроцесс вызов

one.py

from time import sleep 
f = open("test.txt","w") #opens file with name of "test.txt" 
sleep(1) 
f.write("I am a test file.") 
sleep (2) 
f.write("Maybe someday, he will promote me to a real file.") 
sleep (1) 
f.write("Man, I long to be a real file") 
sleep (1) 
f.write("and hang out with all my new real file friends.") 
f.close() 

subpro.py

import subprocess 

def oneCall(): 
    subprocess.call(['python','one.py']) 



if __name__ == '__main__': 
    print "Writing Data" 
    oneCall() 

когда Я запустил subpro.py, индикатор покажет, как он зависает, есть ли способ, чтобы я мог изменить его на индикатор выполнения? так что пользователь будет знать, что в фоновом режиме есть прогресс?

ответ

0

Там уже существуют библиотеки Python, которые делают точно такие, как progress или progressbar.

Вы также можете реализовать его самостоятельно, см. this SO post.

В основном идея состоит в том, чтобы команда write и flush отображалась в командной строке, чтобы индикатор хода отображался как движущийся.

Processing |###########      | 30% 
0

hi ниже мое решение. но, к сожалению, загрузка выполняется только после завершения one.py и two.py.

как сделать его

сделано (one.py)

сделано (two.py)

import subprocess 
import time, sys 
import threading 
def oneCall(): 
    subprocess.call(['python','one.py']) 

def twoCall(): 
    subprocess.call(['python','two.py']) 


class progress_bar_loading(threading.Thread): 

    def run(self): 
      global stop 
      global kill 
      print 'Loading.... ', 
      sys.stdout.flush() 
      i = 0 
      while stop != True: 
        if (i%4) == 0: 
         sys.stdout.write('\b/') 
        elif (i%4) == 1: 
         sys.stdout.write('\b-') 
        elif (i%4) == 2: 
         sys.stdout.write('\b\\') 
        elif (i%4) == 3: 
         sys.stdout.write('\b|') 

        sys.stdout.flush() 
        time.sleep(0.2) 
        i+=1 

      if kill == True: 
       print '\b\b\b\b ABORT!', 
      else: 
       print '\b\b\b done!', 


kill = False  
stop = False 
p = progress_bar_loading() 
p.start() 

try: 
    #anything you want to run. 
    oneCall() 
    twoCall() 
    time.sleep(1) 
    stop = True 
except KeyboardInterrupt or EOFError: 
     kill = True 
     stop = True 
Смежные вопросы