Hoe te constant Python-script uitvoeren op de achtergrond op Windows?

Ik heb een script gemaakt dat bestanden van de ene map naar de andere beweegt.
Maar aangezien de originele map de map Downloads is, heb ik het nodig om altijd op de achtergrond te lopen.

Ik heb ook een standaard batchbestand dat er zoiets uitziet:

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

Ik gebruik Windows 10 . Ik heb informatie voor Linux en OS gevonden over het gebruik van nohupin het batchbestand.
Is er een Windows-versie?

Als u hier nodig is om het script uit te voeren elke keer dat u de pc opnieuw opstart of schakelt?

Hoe beëindig u het proces wanneer u het doet om het permanent te maken?

Veel bedankt


Antwoord 1, Autoriteit 100%

Op Windows kunt u pythonw.exeom een ​​Python-script als achtergrondproces uit te voeren:

Python-scripts (bestanden met de extensie .py) worden uitgevoerd door
python.exestandaard. Dit uitvoerbare bestand opent een terminal, die blijft
open, zelfs als het programma een GUI gebruikt. Als je dit niet wilt
gebeuren, gebruik de extensie .pywdie ervoor zorgt dat het script is
geëxecuteerd door pythonw.exestandaard (beide executables bevinden zich in
het hoogste niveau van de installatiemap van uw Python). Deze onderdrukt
het terminalvenster bij het opstarten.

Bijvoorbeeld,

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

Om uw script continu te laten draaien, kunt u schedvoor het plannen van evenementen:

De sched-module definieert een klasse die een algemeen doel implementeert
evenementenplanner

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()

Om nu een achtergrondproces op Windows te beëindigen, hoeft u alleen maar het volgende uit te voeren:

taskkill /pid processId /f

Waar processIdde ID is van het proces dat u wilt doden.


Antwoord 2, autoriteit 20%

Eén optie is om uw script te wijzigen, zodat het bedoeld is om continu te worden uitgevoerd in plaats van herhaaldelijk. Wikkel het hele ding in een while-lus en voeg een slaapstand toe.

import time
while True:
   your_script_here
   time.sleep(300)

Om ervoor te zorgen dat dit opstart met de machine en om automatisch opnieuw te starten in het geval van een uitzondering, raad ik aan om er een Windows-service van te maken met behulp van Non-Sucking Service Manager (www.nssm.cc). Hier zijn een paar stappen voor nodig (zie de documenten) maar als je eenmaal klaar bent, is je script gewoon een andere Windows-service die je kunt starten en stoppen vanuit het standaard hulpprogramma services.msc.


Antwoord 3, autoriteit 7%

Ik heb een oplossing gevonden die werkt:

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)

Als u de bovenstaande code uitvoert zonder de time.sleep()-functie, crasht het programma nadat een nieuw bestand de map binnenkomt vanwege een ‘bestand niet gevonden’-fout die is genest in een andere ‘bestand niet gevonden’-fout.
Ik weet niet zeker waar dat over gaat, maar ik ben blij met wat ik tot nu toe heb.
Het enige dat u nu hoeft te doen, is het script toevoegen aan de Taakplanner om het onder Pythonw uit te voeren, zodat het als een achtergrondproces werkt. Of in plaats van het script uit te voeren, kunt u een batchbestand uitvoeren zolang u eraan denkt de juiste instructie voor pythonw toe te voegen. Je hoeft het proces natuurlijk maar één keer te starten.

Other episodes