使用Windows7按计划触发python脚本的最简单方法是什么



当我尝试使用任务调度器运行它时,它永远不会工作。它会给我一些奇怪的错误,比如0x1,而且脚本永远不会运行。我在谷歌上搜索了这个问题,但真的找不到一个充分、简单的解决方案。(有人建议在Windows中编写批处理脚本,但我不太确定如何做到这一点,所以我宁愿先尝试不同的方法)。

在Windows7中的任务调度程序GUI上,我启动一个程序/脚本,然后进入python.exe目录。我添加到调度器GUI的参数是python脚本的位置。我以最高权限运行它(复选框),但没有用(它不起作用)。

如果有另一种按计划运行python脚本的方法,我很乐意听到。我宁愿不使用像apscheduler这样看似特别的方法,因为它可能需要我的脚本始终运行(?)。也许有一种方法可以守护这个进程?我确实试过用芹菜,但没有用。

例如:

from celery.task import periodic_task
from celery.schedules import crontab
@periodic_task(run_every=timedelta(seconds=30))
def every_30_seconds():
    print("Running periodic task!")

也不起作用,因为它显然是一个不推荐使用的装饰器。如有任何帮助,我们将不胜感激。打印报表从不打印。

谢谢。

我会认真考虑任务调度器。

我刚刚设置了一个快速Python脚本,作为一个计划任务在我的机器上运行,它很有效。(然而,我使用的是Windows 8.1而不是Windows 7,但我无法想象这会有多大区别。)

如果你不能让Python脚本自己工作,你可以写一个短批脚本来启动你的Python脚本:下面这样的东西应该可以工作:

@echo off
python YourScript.py > output.log 2> errors.log

请随意使用Python可执行文件和/或此行中提到的各种文件的完整路径。

任务调度器在工作时工作正常,但当它无法运行任务时,可能很难找到问题所在,因为任务调度器通常只显示退出代码。将输出/错误写入文件可以查看Python可能生成的任何输出或回溯,并帮助您了解问题所在。

以下两个类演示了在Python中调度任务并将调度程序进程与活动进程分离是多么容易。通过划分这两个任务,可以防止活动中的任何问题传播到调度程序中(例如内存泄漏等)。

class Scheduler(sched.scheduler):
    "Scheduler(path, extension) -> Scheduler instance"
    SECOND_1 = 1
    MINUTE_1 = SECOND_1 * 60
    HOUR_1 = MINUTE_1 * 60
    def __init__(self, path, extension):
        "Initialize the scheduler and schedule the first run after a minute."
        super().__init__()
        self.__path = path
        self.__extension = extension
        self.__processed_files = set(self.matched_files)
        self.enter(self.MINUTE_1, 0, self.process_new_files)
    @property
    def matched_files(self):
        "Read-only property of files matching path and extension."
        return glob.iglob('{}\*.{}'.format(self.__path, self.__extension))
    @property
    def unprocessed_files(self):
        "Read-only property of files that have not been processed."
        return set(self.matched_files) - self.__processed_files
    def process_new_files(self):
        "Schedule to run later and process any unprocessed files."
        self.enter(self.HOUR_1, 0, self.process_new_files)
        print('Checking for unprocessed files @', time.strftime('%c'))
        for file in self.unprocessed_files:
            print('Processing:', repr(file), '...', end='')
            processor = Processor(file)
            processor.start()
            processor.join()
            self.__processed_files.add(file)
            print(' DONE')
        print()
################################################################################
class Processor(multiprocessing.Process):
    "Processor(file) -> Processor instance"
    def __init__(self, file):
        "Initialize processor with the file that needs to be processed."
        super().__init__()
        self.__file = file
    def run(self):
        "In a new process, run the original program while logging errors."
        log_errors(process_files, (self.__file, 'Items.txt'))

我会重新访问任务调度程序,假设总是在PC打开时运行,请尝试以下操作:

1) 开放任务调度程序

2) 在菜单栏中单击"操作",然后单击"创建任务"

3) 在"常规"选项卡下,给它一个名称和描述,并配置您的安全选项

4) 在触发器选项卡下,单击"新建…"

5) 在"开始任务"下拉框中选择"启动时"

6) 选中"重复任务间隔"框,然后设置重复间隔

7) 单击"确定",然后打开"操作"选项卡

8) 在"程序/脚本"框中添加python的路径

9a)在"添加参数"框中添加脚本的完整路径,或者:

9b)将脚本的目录添加到"起始位置"框中,然后仅将脚本名称添加到参数框中

10) 点击确定

这应该不会有问题,但是,如果你的任何路径名中有空格,你需要用引号将它们括起来,否则它们将被解释为单独的参数,python将无法使用它做任何事情。

James

相关内容

  • 没有找到相关文章

最新更新