问题
I have created a script that moves files from one folder to another. But since the original folder is the Downloads folder I need it to always run in the background.
I also have a standard Batch file that looks something like this:
@py C:\\Python\Scripts\moveDLs.py %*
I'm using Windows 10. I have found info for Linux and OS on how to use nohup
in the batch file.
Is there a Windows version?
If there is do you need to execute the script every time you restart or switch the PC on?
Also, how do you terminate the process when you do manage to make it permanent?
Many Thanks
回答1:
On Windows, you can use pythonw.exe in order to run a python script as a background process:
Python scripts (files with the extension
.py
) will be executed bypython.exe
by default. This executable opens a terminal, which stays open even if the program uses a GUI. If you do not want this to happen, use the extension.pyw
which will cause the script to be executed bypythonw.exe
by default (both executables are located in the top-level of your Python installation directory). This suppresses the terminal window on startup.
For example,
C:\ThanosDodd\Python3.6\pythonw.exe C:\\Python\Scripts\moveDLs.py
In order to make your script run continuously, you can use the sched module that helps with event scheduling:
The sched module defines a class which implements a general purpose event scheduler
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()
Now in order to kill a background process on Windows, you simply need to run:
taskkill /pid processId /f
Where processId
is the ID of the process you want to kill.
回答2:
One option is to change your script so it is intended to run continuously rather than repeatedly. Just wrap the whole thing in a while loop and add a sleep.
import time
while True:
your_script_here
time.sleep(300)
In order to make sure this starts up with the machine and to provide automatic restarts in the event of an exception I'd recommend making it into a Windows service using Non-Sucking Service Manager (www.nssm.cc). There are a few steps to this (see the docs) but once done your script will be just another windows service which you can start and stop from the standard services.msc utility.
回答3:
I've found a solution that works:
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)
If you perform the above code without the time.sleep() function the program crashes after a new file enters the folder due to a 'file not found' error nested inside another 'file not found' error. Not sure what that's about but I'm happy with what I have so far. Only thing you need to do now is add the script to the Task Scheduler to run under Pythonw so it operates as a background process. Or instead of running the script you could run a batch file as long as you remember to add the appropriate instruction for pythonw. You only need to start the process once of course.
来源:https://stackoverflow.com/questions/59125493/how-to-constantly-run-python-script-in-the-background-on-windows