我一直在用 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 方法。我不相信任何一种方法都比另一种更好(就使计划任务执行而言),所以我只是直接调用脚本。
我主要在寻找解决这个一般问题的建议和最佳实践,而不是对上面发布的示例脚本的具体修复。