mettre en pause / reprendre un script python au milieu
Puis-je avoir de l'exécution d'un script python(sous Windows)interrompu en son milieu par l'utilisateur , et de reprendre à nouveau lorsque l'utilisateur décide ?
Il y a un gestionnaire principal de programme qui génère,les charges et les exécute d'autres scripts python (en appelant python script.py à partir de la console).Je n'ai pas l'interface graphique utilisateur et peuvent interagir par le biais de la console.Je veux que mon programme principal d'être en mesure de répondre à l'utilisateur de mettre en pause/reprendre la commande pour l'exécution de script.Dois-je définir un thread? Quelle est la démarche ?
Modifier/Mise À Jour :
Disons que j'ai une petite application en python avec une interface qui a des fonctions différentes. J'ai une commande à EXÉCUTER, qui exécute les scripts python en arrière-plan .Je veux mettre en œuvre un dispositif de PAUSE qui permettrait de mettre en pause l'exécution d'un script python . Lorsque les commandes de l'utilisateur d'EXÉCUTER à nouveau, puis le script python devrait reprendre
en cours d'exécution .
à l'aide de raw_input() ou print() force l'utilisateur à la question de la commande.Mais dans ce cas, nous ne savons pas quand l'utilisateur veut interrompre/pause/numéro de commande.Tellement l'habitude d'entrée/de l'impression n'est pas utilisable.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Ok, d'après ce que j'ai vu dans mes recherches sur ce point, même avec filetage,
sys.stdin
va travailler contre vous, peu importe comment vous obtenez pour elle (input()
ou mêmesys.stdin.read()
.readline()
etc.), parce qu'ils bloquent.Au lieu de cela, écrire votre gestionnaire de programme comme un socket serveur ou quelque chose de similaire.
Écriture des scripts comme des générateurs, qui sont conçus pour suspendre l'exécution (à chaque fois qu'il frappe une
yield
), et il suffit d'appelernext()
sur, chacun à son tour, à plusieurs reprises. Vous recevrez unStopIteration
exception lorsqu'un script se termine.Pour la manipulation des commandes, écrivez un deuxième script qui se connecte au gestionnaire de programme de la douille et de l'envoie de messages, ce sera l'interface de la console de l'utilisateur interagit avec (plus tard, vous pouvez même le mettre à niveau vers une interface graphique sans altérer beaucoup d'ailleurs).
Le serveur choisit ces commandes avant d'exécuter la prochaine itération sur les scripts, et si un script est interrompue par l'utilisateur, le gestionnaire de programme il suffit de ne pas faire appel
next()
sur ce script jusqu'à ce que l'utilisateur lui demande d'exécuter à nouveau.Je n'ai pas testé, mais je pense ça marchera mieux que de faire des threads ou des sous-processus pour les scripts externes, et d'essayer ensuite de le mettre en pause (et, plus tard, tuer).
C'est vraiment hors de ma profondeur, mais peut-être que l'exécution des scripts en arrière-plan et à l'aide de
kill -stop
etkill -cont
faire une pause et de continuer à travailler (en supposant que Linux)?Si c'était unix, je vous recommande de signal, mais ici, c'est une version crue qui fait ce que vous demandez.
Utilisez Ctrl+C pour arrêter la lecture, ENTREZ reprendre. Ctrl+Pause peut probablement être utilisé comme un dur à tuer, mais je n'ai pas la clé sur ce clavier.
Une version plus robuste pourrait utiliser select sur un tuyau/socket, ou même threads.
Vous pouvez faire une simple solution de contournement, par la création d'un
PAUSEFILE
. Votre pour être en pause script peut vérifier périodiquement l'existence (ou contenu) de ce dossier.De l'utilisateur
PAUSE
commande peut créer (ou de remplir avec un contenu approprié) tel fichier.J'ai utilisé cette méthode dans une situation similaire, où je voulais être capable de mettre en pause mes scripts Python et de les reprendre plus tard. Ils contiennent quelque chose comme
dans leur boucle principale.
Il est méchant et peut être brisé si le code était vraiment elle, mais pour les cas d'utilisation, d'où la pause est fait par les utilisateurs au hasard, je suppose qu'il ne sera pas question.
La
PAUSE
de commande est simplementtouch $PAUSEFILE
.Je ne comprends pas très bien votre approche, mais à chaque fois qu'un utilisateur a besoin d'appuyer sur entrée pour continuer le script, vous devez utiliser:
sans affecter la réception de la réponse à une variable.
Avez-vous essayé l'évidence et imprimer une invite alors lu une ligne de l'entrée standard stdin? Qui fera une pause à l'ensemble de votre script.
Ce que vous avez demandé à votre question de départ n'est pas très clair, donc, si ce n'est pas faire ce que vous voulez, pouvez-vous expliquer pourquoi?
Si vous êtes le lancement de votre script python dans la fenêtre de commande windows, vous pouvez utiliser msvcrt.kbhit() en tant que non-blocage de la touche de vérifier que mis en place ici:
http://code.activestate.com/recipes/197140-key-press-detection-for-windows-text-only-console-/
J'ai trouvé tellement hacky ces réponses, tout en étant intéressant aussi.
La meilleure approche est la https://stackoverflow.com/a/7184165/2480481 de le faire à l'aide de
KeyboardInterrupt
exception.Que j'ai remarqué que personne n'mention "à l'aide d'un débogueur", je vais le faire.
Installer apb, Python débogueur avec
pip install pdb
.Suivre pour faire de votre script pausable https://stackoverflow.com/a/39478157/2480481 par Ctrl+c au lieu de le quitter.
Le principal avantage de l'utilisation d'un débogueur (apb) est que vous pouvez inspecter les variables, les valeurs, etc. C'est de loin plus puissant que simplement mettre en pause/continuer.
Vous pouvez également ajouter des Ipython interface avec apb attaché à déboguer votre application se bloque. Regardez: https://stackoverflow.com/a/14881323/2480481