Python 在 windows 服务器 2012 上使用调度程序调用时记录器未记录

Python logger not logging when called with scheduler on windows server 2012

我在 Windows 服务器上写了一个简单的 "git pull" 脚本 运行:

import logging
import subprocess

# Initialize logging
logger = logging.getLogger('autopull')
logger.setLevel(logging.INFO)
log_file = logging.FileHandler('autopull.log')
log_file.setLevel(logging.INFO)
formatter = logging.Formatter("%(asctime)s:%(levelname)s:%(message)s")
log_file.setFormatter(formatter)
logger.addHandler(log_file)

# Main part
logger.info('Started')
try:
    subprocess.check_output("C:\Program Files\Git\cmd\git pull")
    logger.info('Pulled repo successfully')
except:
    logger.exception("Pulled failed")

我使用了记录器,因为调度程序总是告诉我它以退出代码 0 执行,我想仔细检查是否是这种情况。

当我手动调用脚本时,它工作正常并且记录器写入 autopull.log。但是,当它被调度程序调用时,记录器什么也不写。任务 运行 与 "Run with highest privileges" 和 "Run whether user is logged or not"。

我是不是哪里做错了?

编辑 1:添加计划任务参数

一般:

触发器:

操作:

条件:

设置:

@老鼠博士,试试这个。我能够 运行 你的代码(注销时)。仅供参考,我也在 Windows 上 运行ning Anaconda。

一旦进入编辑操作 window(在上面显示的操作中,单击编辑按钮),在 program/script 中,确保它指向实际实例你的 Python (Anaconda)。

在 Program/Script

两边加上双引号
"D:\Anaconda3\python.exe"

不要复制粘贴,输入即可。

在可选参数中添加:

-u "D:\projects\foo\autopull.py"

在开始于(可选)中将文件夹位置添加到不带引号的脚本中:

D:\projects\foo

如果上述方法不起作用,出于故障排除目的:

  • 当您在任务计划程序中单击 运行(运行 立即执行)时是否有效(登录时自然如此)?
  • 在任务调度器中,您是否查看了任务的历史记录以查看调度器在哪里失败?

编辑:仔细想想,我记得 运行ning python 直接使用 "Run whether user is logged on or not".

有一些问题

如果以上方法不起作用,试试这个:

创建批处理文件 (.bat) 并在其中添加以下行:

D:\Anaconda3\python.exe D:\projects\foo\autopull.py %*

将任务调度器指向这个批处理文件(而不是直接指向 python 脚本)。