2

我一直在用 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 方法。我不相信任何一种方法都比另一种更好(就使计划任务执行而言),所以我只是直接调用脚本。

我主要在寻找解决这个一般问题的建议和最佳实践,而不是对上面发布的示例脚本的具体修复。

4

6 回答 6

6

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

一般来说:

  • 确保通过任务计划程序 GUI 将“开始于”属性设置为操作中的脚本目录
  • 在脚本中执行完整的文件引用,包括目录
  • 如有必要,以经过身份验证的用户身份运行任务,并在常规设置中“以最高权限运行”
  • 由于各种原因,您可能会更幸运地将任务作为批处理文件运行,该文件调用 python.exe 来运行您的脚本
于 2014-08-21T04:26:16.117 回答
2

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

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

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

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

于 2012-06-21T14:55:31.290 回答
1

几点注意事项:

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

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

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

于 2012-06-21T15:27:09.467 回答
1

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

于 2016-09-26T16:49:51.810 回答
-1

首先,除非您正确设置 windows,否则 windows 对 python 或 .py 文件一无所知。确保你正在这样做。

其次,用一个完全最小的python脚本试试这个——例如一个简单地接触目录中的文件的脚本。这将告诉您您的脚本是否正在运行。

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

于 2012-06-21T15:00:33.603 回答
-1

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

于 2017-03-28T12:19:22.033 回答