【问题标题】:Cannot schedule a python script to run through Windows Task Scheduler无法安排 python 脚本通过 Windows 任务计划程序运行
【发布时间】:2020-06-12 21:02:49
【问题描述】:

我已经设置了我的 Windows 任务调度程序来创建一个任务来运行一个 python 脚本,该脚本将向几个人(包括我自己)发送一封电子邮件。

我在程序/脚本的操作选项卡中添加了我的 Python 的位置

C:\Users\User\AppData\Local\Programs\Python\Python37\python.exe

我添加了我的 python 文件作为参数 文件的路径为 Start in:

C:\Users\User\Documents\GitHub\automation

但是,当我运行脚本时(我通过每 5 分钟运行一次 15 分钟来测试它)。 Python.exe 短暂打开,但我的 python 脚本中的电子邮件没有发送,这意味着脚本没有运行。我已经多次测试了我的代码并且知道它可以工作。

【问题讨论】:

  • 这(很可能)意味着您的代码中有一个错误,导致Python 无法发送电子邮件。尝试在命令提示符下执行您的程序。 (win + r,然后输入 cmd.exe 并输入)
  • @Unsigned_Arduino 代码在我的 IDE 终端中运行,但是当我尝试在 cmd.exe 中运行它时出现错误“没有名为“gspread”的模块。猜我必须将我导入的所有库添加到 requirements.txt 并将其导入我的代码中?
  • 你必须全局安装这个库,就像在命令提示符下做一个pip install (your module name)
  • 可能是凭据问题。请参阅my answer 了解略有不同的 Windows 调度问题。
  • 诊断此问题的第一步是让任务调度程序运行一个脚本,在完全限定的位置创建一个输出文件。在文件中写入os.getcwd()sys.executablesys.path等一些基本信息。尝试导入您希望可用的包,并处理ImportError 以记录任何丢失的包。

标签: python windows taskscheduler


【解决方案1】:

如果您在任务调度程序中检查该任务的历史记录,您将看到 Python 解释器返回的退出代码。这很可能是权限问题(您配置解释器运行的用户帐户没有足够的权限来执行脚本中包含的所有语句)或缺少要求。您在 cmets 中提到您使用的是 IDE;如果是这种情况,那么您很可能在 IDE 中使用了虚拟环境,因此系统安装的 python 缺少您用于运行代码的包,导致电子邮件无法发送出去。

如果您在 IDE 项目中指定了 requirements.txt 文件,您可以通过确保运行 pip install -r <requirements.txt file location> 来解决任何依赖错误,或者您可以简单地使用类似的 pip 命令手动安装所需的包。如果问题是 Windows 权限,您可以创建一个具有更高权限的新 Windows 用户(假设您在自己的系统上具有管理员访问权限)并让任务以该用户身份运行,或者您可以启用 Run with highest privileges 检查按钮属性在你的任务中。

【讨论】:

    【解决方案2】:

    任务计划程序很可能在 Windows 中的服务帐户下运行。这意味着它无法访问您在本地安装的所有软件包。要解决此问题,请尝试

    pip freeze —user > requirements.txt
    

    然后在管理命令窗口中:

    pip install requirements.txt
    

    这将重新安装软件包,以便所有用户都可以使用它们

    【讨论】:

    • 任务计划程序是托管在 svchost.exe 进程中的服务。此进程在会话 0 中以 SYSTEM 身份运行,并托管许多类似的服务,例如辅助登录服务。任务计划程序可以在属于该用户的交互式会话中或在会话 0 中以任何用户身份运行任务,前提是任务配置为允许并且用户具有批量登录权限。如果“python.exe 短暂打开”表示 Emm 看到控制台窗口短暂闪烁,则任务配置为在 Emm 在交互式会话中登录时使用 Emm 的帐户运行。
    • 很酷,但是会话 ID 与用户 ID 不同。我相信您可以在同一会话中在不同的 UID 上运行进程,但我不确定。例如“runas”命令。
    • 一个交互式会话有一个主访问令牌和登录,可以通过WTSQueryUserToken查询。任务计划程序在交互运行时使用此登录。与 runas.exe 不同,它不支持在另一个用户的会话中进行二次登录。它会使用哪个会话——任意会话?没门。如果用户具有批量登录权限,则任务计划程序可以使用用户存储的用于批量登录的密码在会话 0 中运行任务。它也可以通过使用 S4U 登录来实现后者而无需存储密码,但该任务将无权访问远程资源。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2015-10-02
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多