如何在Windows后台持续运行Python脚本?

26

我已经创建了一个脚本,可以将文件从一个文件夹移动到另一个文件夹。 但由于原始文件夹是“下载”文件夹,我需要它始终在后台运行。

我还有一个标准的批处理文件,看起来像这样:

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

我正在使用Windows 10。我已经找到了有关Linux和OS如何在批处理文件中使用nohup的信息。 那么Windows版本呢?

如果有,您需要每次重新启动或打开电脑时执行脚本吗?

另外,当您成功使其永久时,如何终止该进程?

非常感谢。


请参考这个链接 - Gabriel Melo
1
这对于如何在启动时运行脚本很有帮助,但我认为我仍然需要添加一些内容使其持续运行。目前我的程序只执行一次运行,然后关闭。 - Thanos Dodd
你可以尝试使用watchdog - Nullman
5个回答

33

在Windows系统中,您可以使用pythonw.exe来将Python脚本作为后台进程运行:

默认情况下,Python脚本(扩展名为.py的文件)会由python.exe执行。这个可执行文件会打开一个终端窗口,即使程序使用GUI,终端窗口也会保持打开状态。如果你不想让这个终端窗口出现,可以改用扩展名.pyw,这样脚本就会默认由pythonw.exe执行(两个可执行文件都位于Python安装目录的顶层)。这样可以抑制启动时的终端窗口。

例如,

C:\ThanosDodd\Python3.6\pythonw.exe C:\\Python\Scripts\moveDLs.py
为了让你的脚本持续运行,你可以使用sched来进行事件调度:

sched模块定义了一个实现通用目的事件调度器的类。

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()
现在要在Windows上结束后台进程,您只需要运行以下命令:

现在要在Windows上结束后台进程,您只需要运行:

taskkill /pid processId /f

其中processId是您想要终止的进程的ID。


1
在我尝试之前,关于终止进程,这个进程会出现在任务管理器中吗? 或者,这个进程的ID叫什么?它只是批处理文件名吗? - Thanos Dodd
1
@ThanosDodd 你可以通过运行 tasklist 命令来查找进程 ID。你应该将服务名称与 PID 相关联。 - Giorgos Myrianthous
最后一个问题:我需要添加什么来使它成为连续的过程,还是SimonN的时间模块想法已经足够解决了这个问题? - Thanos Dodd
@ThanosDodd 这要看你想实现什么。SimonN的方法应该可以解决问题,但我感觉使用其他手段,比如cron jobs (或者Windows下的scheduled tasks),会更自然一些。你可以在这篇文章中找到更多信息:https://dev59.com/fmw05IYBdhLWcg3wgyHI - Giorgos Myrianthous
是的,我以前使用过任务计划程序,但最常见的选项是“每5分钟一次”。我要找的是文件一进入下载文件夹就立即移动。 - Thanos Dodd

7

一种选择是改变您的脚本,使其连续运行而不是重复运行。只需将整个脚本放在while循环中,并添加一个sleep。

import time

while True:
   your_script_here
   time.sleep(300)

为了确保在计算机启动时自动运行并在异常情况下提供自动重启,建议使用 Non-Sucking Service Manager (www.nssm.cc) 将其制作成 Windows 服务。这需要执行几个步骤(请参阅文档),但一旦完成,您的脚本将成为另一个可以在标准services.msc实用程序中启动和停止的Windows服务。


谢谢你的见解。你知道为什么在使用无限循环而没有使用time.sleep函数时,当一个新文件出现在文件夹中时会出现错误吗? - Thanos Dodd
2
不使用time.sleep是一个坏主意,因为它会尽可能快地循环并消耗所有CPU(至少是它可以访问的所有CPU)。我怀疑崩溃是因为它试图访问一个尚未完全写入的文件,或者甚至是在下载过程中出现然后消失的临时文件。如果你运气不好,这种情况可能会发生,但没有sleep的话,这几乎是确定的。 - Simon Notley

2

如果您想让代码在后台持续运行,您需要更改文件扩展名

.py变为.pyw

在运行脚本之前,您需要执行以下操作:

从CMD(命令提示符)控制台中运行命令:pip install pythonw

要启动程序,请在CMD中(文件所在的文件夹中)运行以下命令:pythonw YOUR-FILE.pyw

现在进程将在后台持续运行。要停止进程,必须运行以下命令:

TASKKILL /F /IM pythonw.exe

注意!!!所有命令都是在文件所在的文件夹中从命令行运行的。

如果您想使用python YOUR-FILE.pyw简单地运行文件,也可以这样做,但您应该始终保持控制台打开。您可以通过从命令提示符(CMD)中按ctrl + C来停止执行。

此处放置源代码:


2
我找到了一个可行的解决方案:
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)

如果你执行上述代码但没有使用time.sleep()函数,当一个新文件进入文件夹时,程序会因为嵌套在另一个“文件未找到”错误中的“文件未找到”错误而崩溃。
我不确定这是什么问题,但我对我目前的工作感到满意。现在唯一需要做的事情就是将脚本添加到任务计划程序中,在Pythonw下运行,以便它作为后台进程运行。或者,你可以运行批处理文件,只要记得添加适当的pythonw指令即可。当然,你只需要启动进程一次。

0

我想创建一个快捷键,无论何时PC开机都可以使用。 我不想使用while True,所以我做了这个。

import keyboard as k

k.add_hotkey("alt+s", lambda: k.write('Hello'))
k.wait('ctrl+shift+1') #this is a combo that I know I don't use so the program keeps running

然后将Python文件放在C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接