2017-08-26 1 views
2

J'ai essayé de créer mon propre bot de discorde visant à l'exécution de code arbitraire, et je suis plutôt satisfait du résultat. Cependant, il semble que chaque fois que le bot est lancé de n'importe où sans une console attachée à lui (unités Systemd, cron ...) le comportement est inattendu et il est incapable d'obtenir des entrées ou des sorties correctement. Cependant, s'il est lancé à partir de ssh ou de l'ordinateur lui-même, rien de tout cela ne se produit. Après quelques essais et erreurs, j'ai supposé que cela devait être dû à la façon dont subprocess gère stdout et stderr, mais je ne suis pas sûr de ce qui se passe. C'est la partie du code qui gère la génération de sous-processus.Le sous-processus python ne semble pas fonctionner correctement lorsqu'il n'y a pas de console connectée

def_subprocess(path_to_executable) 

    timeout_flag = True 
    run_process = subprocess.Popen(path_to_executable, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    try: 
     stdout, stderr = run_process.communicate(timeout=5) 
    except subprocess.TimeoutExpired: 
     stdout, stderr, timeout_flag = timeout(run_process) 

    return stdout.decode("utf-8"), stderr.decode("utf-8"), timeout_flag 




def timeout(process): 
    line_number = 0 
    stderr = b"" 
    stdout = b"" 
    while line_number < 5: 
     stdout += process.stdout.readline() 
     line_number += 1 
    process.kill() 
    timeout_flag = True 
    return stdout, stderr, timeout_flag 

Il ne semble pas qu'il n'y a pas stdout ou stderr, au lieu qu'il se sent comme il n'attend pas la fin du processus et il produit juste ordures (Donner le robot la même entrée ne garantit pas la même sortie, comme vous pouvez le voir dans cette image :)

as you can see in this image.

and in this other one too

Je suis déconcerté, et je n'ai aucune idée sur ce qui pourrait se produire.

+1

'discord.py' est construit sur' asyncio', votre code bloque-t-il quand il ne le devrait pas? Avez-vous des erreurs/sortie dans la console où vous avez démarré le bot? Toutes les erreurs python que le bot produira seront affichées ici. –

+0

C'est le problème Patrick, quand il est lancé depuis une console, aucun de ces comportements ne se produit. Au lieu de cela, j'obtiens le comportement attendu où tout fonctionne correctement. Cela ne fonctionne pas quand il n'y a pas de console attachée, et quand cela arrive, je ne peux pas vérifier la sortie. – Kurolox

+0

Désolé, j'ai oublié de vous mentionner @PatrickHaugh. – Kurolox

Répondre

0

Bien que n'étant pas vraiment une solution, j'ai trouvé une solution de contournement décente en utilisant l'écran comme intermédiaire entre systemd et mon bot. Systemd lance l'écran au démarrage, et l'écran gère mon bot sans présenter aucun des problèmes. Je vais rester avec ça.