当我尝试使用任务调度器运行它时,它永远不会工作。它会给我一些奇怪的错误,比如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