web-dev-qa-db-fra.com

Comment exécuter constamment le script Python en arrière-plan sur Windows?

J'ai créé un script qui déplace des fichiers d'un dossier à un autre. Mais comme le dossier d'origine est le dossier Téléchargements, j'en ai besoin pour toujours fonctionner en arrière-plan.

J'ai également un fichier batch standard qui ressemble à ceci:

@py C:\\Python\Scripts\moveDLs.py %*

J'utilise Windows 1. J'ai trouvé des informations pour Linux et OS sur la façon d'utiliser Nohup dans le fichier batch. Existe-t-il une version Windows?

Si vous avez besoin d'exécuter le script à chaque redémarrage ou mise sous tension du PC?

De plus, comment arrêtez-vous le processus lorsque vous parvenez à le rendre permanent?

Merci beaucoup

3
Thanos Dodd

Sous Windows, vous pouvez utiliser pythonw.exe pour exécuter un script python en arrière-plan:

Scripts Python (fichiers avec l'extension .py) sera exécuté par python.exe par défaut. Cet exécutable ouvre un terminal, qui reste ouvert même si le programme utilise une interface graphique. Si vous ne souhaitez pas que cela se produise, utilisez l'extension .pyw qui provoquera l'exécution du script par pythonw.exe par défaut (les deux exécutables sont situés au niveau supérieur de votre Python). Cela supprime la fenêtre du terminal au démarrage.

Par exemple,

C:\ThanosDodd\Python3.6\pythonw.exe C:\\Python\Scripts\moveDLs.py

Afin de faire fonctionner votre script en continu, vous pouvez utiliser le module sched qui aide à la planification des événements:

Le module sched définit une classe qui implémente un planificateur d'événements à usage général

import sched
import time

event_schedule = sched.scheduler(time.time, time.sleep)

def do_something():
    print("Hello, World!")
    event_schedule.enter(30, 1, do_something, (sc,))

event_schedule.enter(30, 1, do_something, (s,))
event_schedule.run()

Maintenant, pour tuer un processus d'arrière-plan sous Windows, il vous suffit d'exécuter:

taskkill /pid processId /f

processId est l'ID du processus que vous souhaitez tuer.

1

Une option consiste à modifier votre script afin qu'il soit conçu pour s'exécuter en continu plutôt que de manière répétée. Enveloppez le tout dans une boucle de temps et ajoutez un sommeil.

import time

while True:
   your_script_here
   time.sleep(300)

Afin de s'assurer que cela démarre avec la machine et de fournir des redémarrages automatiques en cas d'exception, je vous recommande d'en faire un service Windows à l'aide de Non-Sucking Service Manager (www.nssm.cc). Il y a quelques étapes à cela (voir la documentation) mais une fois terminé, votre script sera juste un autre service Windows que vous pouvez démarrer et arrêter à partir de l'utilitaire services.msc standard.

1
SimonN

J'ai trouvé une solution qui fonctionne:

import shutil, os, time

while True:
    for filename in os.listdir('folderToMoveFrom'):
        if filename.endswith((desired file extensions)):
            shutil.move( (folderToMoveFrom + filename), folderToMoveTo)
    time.sleep(6)

Si vous exécutez le code ci-dessus sans la fonction time.sleep (), le programme se bloque lorsqu'un nouveau fichier entre dans le dossier en raison d'une erreur "fichier non trouvé" imbriqué dans une autre erreur "fichier non trouvé". Je ne sais pas de quoi il s'agit, mais je suis satisfait de ce que j'ai jusqu'à présent. La seule chose que vous devez faire maintenant est d'ajouter le script au Planificateur de tâches pour qu'il s'exécute sous Pythonw afin qu'il fonctionne comme un processus d'arrière-plan. Ou au lieu d'exécuter le script, vous pouvez exécuter un fichier de commandes tant que vous vous souvenez d'ajouter les instructions appropriées pour pythonw. Vous n'avez besoin de démarrer le processus qu'une seule fois bien sûr.

0
Thanos Dodd