为什么看似有效的Python脚本在通过Windows任务计划程序启动时无法运行?

时间:2012-06-21 14:45:32

标签: python windows-scheduler

我一直在用Python编写脚本,我想在计划的基础上自动在Windows服务器上运行。我非常简单地尝试使用批处理文件,但他们热情地转而使用Python脚本,并且我们正在使用它们。我编写的脚本很容易编写,当我手动执行它们时,它们完全按照我希望它们执行的操作完成。我现在编写了许多不同的脚本,主要处理复制,删除和重命名文件或移动目录。

问题是当我尝试使用Windows任务计划程序安排Python脚本时,其中许多程序无法运行(任务计划程序说“上次运行结果= 0x1”)。这事儿常常发生。我也有类似批处理文件的经验(可以手动运行的批处理文件在计划时无法运行)。鉴于我迄今为止经验有限,我不得不说这肯定是Windows任务计划程序问题,而不是Python问题。

以下是一个示例Python脚本:

#import modules
import os, shutil, datetime, subprocess

#global variables
zip_dir = 'Y:\7z'
zip_dir_misc = 'X:\7z'
zip_extension = '.7z'

def newest_zip_file(directory, extension = zip_extension): 
  return max(
    (os.path.join(dir_name, file_name)
    for dir_name, dir_names, file_names in os.walk(directory)
    for file_name in file_names
    if file_name.endswith(extension)),
    key=lambda fn: os.stat(fn).st_mtime)  

def copy_zip_file(src_dir_p, temp_dir_p):
  src_file = newest_zip_file(src_dir_p)
  new_file = temp_dir_p + '\\' + os.path.basename(src_file)
  shutil.copyfile(src_file, new_file)

copy_zip_file(zip_dir, zip_dir_misc)

此脚本通过网络文件夹(表示为X:分区)将.7z文件从一台服务器复制到另一台服务器。此脚本在手动运行时有效,但在计划时则无效。但是,当更改脚本以将相同的.7z文件复制到同一服务器上的另一个目录(而不是联网文件夹)时,无论是手动执行还是计划执行,脚本都可以正常运行。

如果我在上面的脚本中以编程方式做错了(也许我指的是网络文件夹不正确)那么我可以修复这个脚本一次(虽然我已经尝试了我能想象的每个组合来定义网络文件夹使用完整的服务器名称之类的东西)。但是我仍然遇到了完全不同的Python脚本同样的问题,这些脚本的行为方式相同,这让我想到了真正的问题:

为什么看似有效的Python脚本在通过Windows任务计划程序启动时无法运行?

我的Windows任务计划程序配置:

  • 运行用户是否已登录
  • 以最高权限运行
  • 动作(Python脚本)直接调用(启动程序:abc.py),不作为参数发送到Python.exe,虽然我已经多次尝试过Python.exe方法。我不相信任何一种方法都比另一种更好(只要使计划任务执行),所以我只是直接调用脚本。

我主要寻找解决此一般问题的建议和最佳做法,而不是对上面发布的示例脚本进行过多具体修复。

6 个答案:

答案 0 :(得分:6)

您提到网络文件夹,这是任务计划程序的已知问题。有关在Python中处理它的提示,请参阅this post

一般而言:

  • 确保您正在设置"开始于"属性到Action via Task Scheduler GUI中的脚本目录
  • 在脚本中执行完整的文件引用,包括目录
  • 如有必要,以经过身份验证的用户身份运行任务,并以最高权限运行"在常规设置中
  • 由于各种原因,您可以更好地运行任务作为调用python.exe来运行脚本的批处理文件

答案 1 :(得分:2)

我对Windows(或其任务计划程序)不太熟悉,但这听起来像是在Unix系统上自动运行Python脚本时遇到的典型cron问题。

cron问题的主要原因是不同的环境和脚本在其中运行的不同用户。它们难以修复的主要原因是因为开发人员在脚本自动运行时缺少错误消息。为了解决这个问题,我通常使用一个包装器脚本,它将Python脚本的所有输出记录到错误日志文件中(只是为了能够在失败后看到错误消息)。

修复原始问题通常也可以通过包装器脚本为Python脚本设置正确的环境(变量和内容)来完成。

正如我所说,我的经验是基于Unix cron,而不是Windows任务计划程序,但问题听起来非常相似。

答案 2 :(得分:1)

几点说明:

确保调度程序用于启动python文件的用户在其PATH中具有python目录;

其次,确保用户也具有网络权限,并且该用户也存在该挂载

第三,确保从正确的文件夹启动。我建议修改脚本以更改为存储.py文件的工作目录,或者使用.bat文件启动,该文件将在启动python脚本之前更改为工作目录。

答案 3 :(得分:1)

我在Windows Server 2012 R2上遇到了这个问题,我想我找到了原因: 似乎在创建任务时加载了environmnet变量。因此,如果您正在使用自己的模块,并且在任务之后设置了PYTHONPATH变量,则任务将始终无法尝试加载新的python模块。 我发现的解决方案只是重新创建任务并使用批处理来启动python脚本。在我的服务器上它可以工作,我希望它能为你做到这一点

答案 4 :(得分:-1)

首先,除非你正确设置窗口,否则windows不知道python或.py文件。确保你这样做。

其次,尝试使用完全最小的python脚本 - 例如,只需触摸目录中的文件。这将告诉您脚本是否正在运行。

第三,如果您认为这是一个Windows问题,那么最好在Superuser或Serverfault上询问。

答案 5 :(得分:-1)

我的脚本运行如下: 启动一个程序: cmd.exe / c c:\ Python27 \ python.exe“c:\ path \ script.py” 以最高权限运行