【问题标题】:How to constantly run Python script in the background on Windows?如何在 Windows 的后台持续运行 Python 脚本?
【发布时间】:2020-03-26 06:33:42
【问题描述】:

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

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

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

我正在使用 Windows 10。我找到了有关如何在批处理文件中使用nohup 的 Linux 和操作系统信息。 有 Windows 版本吗?

如果每次重启或开机都需要执行脚本?

另外,当你设法使它永久化时,你如何终止它?

非常感谢

【问题讨论】:

  • 考虑this
  • 这对如何在 StartUp 上运行脚本很有帮助,但我认为我仍然需要添加一些内容以使其不断运行。目前我的程序只运行一次然后关闭
  • 你可以试试watchdog

标签: python background-process nohup


【解决方案1】:

在 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 上的后台进程,您只需运行:

taskkill /pid processId /f

processId 是您要杀死的进程的 ID。

【讨论】:

  • 谢谢。在我尝试之前,关于终止,进程会不会出现在任务管理器中?或者,进程 ID 将被称为什么?它只是批处理文件名吗?
  • @ThanosDodd 你可以通过运行tasklist 找到processId。您应该将服务名称与 PID 相关联。
  • 最后一个问题:我是否需要添加任何东西以使其成为一个连续的过程,或者 SimonN 的时间模块想法是否充分解决了这个问题?
  • @ThanosDodd 这取决于。关于你想要达到的目标。 SimonN 的方法应该可以解决问题,但我觉得使用其他方法更自然,例如 cron 作业(或 Windows 的计划任务)。您可以在这篇文章中找到更多信息:stackoverflow.com/questions/7195503/…
  • 是的,我以前使用过任务计划程序,但最常用的选项是“每 5 分钟”。我正在寻找的是文件在进入下载文件夹后立即移动
【解决方案2】:

一种选择是更改您的脚本,使其连续运行而不是重复运行。只需将整个事情包装在一个while循环中并添加一个睡眠。

import time

while True:
   your_script_here
   time.sleep(300)

为了确保它与机器一起启动并在发生异常时提供自动重启,我建议使用非吸盘服务管理器 (www.nssm.cc) 将其设置为 Windows 服务。这有几个步骤(请参阅文档),但一旦完成,您的脚本将只是另一个 Windows 服务,您可以从标准 services.msc 实用程序启动和停止。

【讨论】:

  • 感谢您的洞察力。你知道为什么在没有time.sleep函数的情况下使用无限循环时文件夹中出现新文件会报错吗???
  • 在没有 time.sleep 的情况下使用它是一个坏主意,因为它会尽可能快地循环并消耗你所有的 CPU(至少它可以访问的所有 CPU)。我怀疑崩溃是因为它试图访问尚未完全写入的文件,或者甚至可能是在下载过程中出现的临时文件然后消失。如果你运气不好,不睡觉也可能发生这种情况,但如果不睡觉,这几乎是肯定的。
【解决方案3】:

我找到了一个可行的解决方案:

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 添加适当的指令,您就可以运行批处理文件,而不是运行脚本。当然,您只需启动该过程一次。

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    相关资源
    最近更新 更多