2017-09-11 9 views
0

J'essaye d'écrire un programme de Python qui suit les prix du marché boursier et le renvoie à l'utilisateur actualisant la même ligne par stderr, c'est une version simplifiée du code (utilisé juste pour vérifier que le programme faisait quelque chose):Mise à jour des lignes dans le terminal tout en faisant d'autres choses sur le dernier en Python?

import random 
import schedule 
import time 
import sys 

def printran(): 
    a = "\rFirst Line is: " + str(random.randint(1,10)) 
    sys.stderr.write(a) 

schedule.every(2).seconds.do(printran) 

while True: 
    schedule.run_pending() 
    time.sleep(1) 

Mes problèmes sont les suivants:

a) Comment puis-je "rafraîchir" la sortie de la console sur plusieurs lignes?

J'ai essayé des choses comme:

a = "\rFirst Line is: " + str(random.randint(1,10)) + "\n\rSecond Line is: " + str(random.randint(2,20)) 

mais la sortie est un gâchis et, évidemment, la commande \ n sera toujours générer une nouvelle ligne

b) puisque la fonction while ne se termine pas vraiment que je ne peux pas faire d'autres choses, dois-je utiliser multithreading? C) trouver une solution aussi facile que possible, facile à utiliser et autonome sur le système d'exploitation (doit fonctionner sous Linux, OSX, Win).

Répondre

0
import random 
import schedule 
import threading 
import time 

def printran(): 
    print("First Line is: " + str(random.randint(1,10))) 


def run(): 
    schedule.every(2).seconds.do(printran) 
    while True: 
     schedule.run_pending() 
     time.sleep(1) 


if __name__ == "__main__": 
    t = threading.Thread(target=run) 
    t.start() 

En outre, vous pouvez utiliser APScheduler Mais dans le code suivant sched.start() n'attendre et il arrêtera avec les principaux.

import random 
from apscheduler.schedulers.background import BackgroundScheduler 
import time 

def printran(): 
    print("First Line is: " + str(random.randint(1,10))) 


if __name__ == "__main__": 
    sched = BackgroundScheduler() 
    sched.add_job(printran, 'interval', seconds=2) 
    sched.start() 
    # wait 10 seconds and exit 
    time.sleep(10) 

devrait être multiplate (je n'ai pas vérifié sur Win, Mac, mais il fonctionne sur linux)