【问题标题】:Problems running python script by windows task scheduler that does pscp执行 pscp 的 Windows 任务调度程序运行 python 脚本时出现问题
【发布时间】:2013-12-10 08:30:58
【问题描述】:

不确定是否有人遇到过这种情况,但我会接受有关故障排除和/或替代方法的建议。

我有一台 Windows 2008 服务器,我正在其上运行多个计划任务。其中一项任务是使用 pscp 登录 linux 机器的 python 脚本,检查新文件,如果有任何新文件,将它们复制到 C: 驱动器上的本地目录。我也在关键点将一些日志记录到脚本中,我正在使用logging.basicConfig(level=DEBUG)

我使用变量command = 'pscp -pw xxxx name@ip:/ c:\local_dir' 构建命令,然后使用subprocess.call(command) 执行命令。

现在这是奇怪的部分。如果我从命令行手动运行脚本,它工作正常。新文件被下载和处理。但是,如果任务计划程序运行脚本,则不会下载新文件。该脚本在同一用户下运行,但产生不同的结果。

根据脚本在linux box上创建的日志文件,脚本成功登录linux box。但是,尽管有新文件,但不会下载任何文件。同样,当我通过命令行运行它时,会下载文件。

有什么想法吗?建议,替代方法?

谢谢。

【问题讨论】:

  • 感谢您的回答。事实证明你们俩都是对的。任务计划程序在两个方面很奇怪:第一;它不喜欢映射驱动器。它适用于 UNC 引用。第二;它喜欢所有内容的完整路径参考。文件、命令、脚本中的语法,一切。事实上,使用这两种技术是我解决问题的方法。现在我唯一的问题是决定哪个答案点击正确,因为两者都有效。

标签: python scheduled-tasks scp


【解决方案1】:

我遇到了类似的问题。在测试中,我发现任何类型的子进程调用都会在任务调度程序中运行时停止 python 脚本,但在命令行上运行时可以正常工作。

import subprocess

print('Start')
test = subprocess.check_output(["dir"], shell=True)
print('First call finished')

在命令行上运行时输出:

Start
First call finished

当从任务调度器运行时,输出是:

Start

为了从任务调度程序中获取输出,我从批处理文件中运行 python 脚本,如下所示:

python test.py >> log.txt

我通过命令行和任务调度程序的批处理文件运行脚本。

【讨论】:

    【解决方案2】:

    我在尝试在 Linux VM 上打开 MS Access 数据库时遇到了同样的问题。在 Windows 7 命令提示符下运行脚本有效,但在任务计划程序中运行它却没有。使用任务计划程序,它会找到数据库并验证它是否存在,但不会返回其中的表。

    解决方案是让任务计划程序运行 cmd 作为程序/脚本,并带有参数 /c python C:\path\to\script.py(在 Add参数(可选))。

    我不能告诉你为什么这有效,但它解决了我的问题。

    【讨论】:

    • 这对我也不起作用。我尝试的每件事,当我按下运行时它什么都不做。 >:(
    • 如何防止每次执行脚本时弹出烦人的“taskeng.exe”窗口(我的脚本每 15 分钟运行一次)?
    【解决方案3】:

    布拉德的回答是对的。子进程需要 shell 上下文才能工作,任务管理器可以在没有它的情况下启动 python。另一种方法是制作一个由调用 python c:\path\to\script.py 等的任务调度程序启动的批处理文件。唯一的区别是,如果你遇到一个有调用的脚本在 os.getcwd() 中,您将始终获取脚本所在的根目录,但当您从任务调度程序调用 cmd 时,您会得到其他内容。

    【讨论】:

      【解决方案4】:

      您可以使用 windows 任务计划程序,但请确保填写“可选”字段“开始于”。

      在任务计划程序应用程序中,添加一个操作,指定要运行“doSomeWork”的 Python 文件,并在 Start in(可选)输入中填写包含该文件的目录。例如,如果您有一个 Python 文件在:

      C:\pythonProject\doSomeWork.py
      

      你会输入:

      Program/Script: doSomeWork.py
      
      Start in (optional): C:\pythonProject 
      

      【讨论】:

      • 我认为这是最好的答案。谢谢。
      • @jax 谢谢。这对我来说最有效,所以我决定发布
      【解决方案5】:

      上次编辑 - 开始

      经过实验......如果你把python程序的完整路径放在那里,它可以在没有最高权限(作为管理员)的情况下工作。意思是这样的任务设置:

      program: "C:\Program Files\Python37\python.exe"
      arguments: "D:\folder\folder\python script.py"
      

      我不知道为什么,但即使脚本使用子进程和多个线程,它也可以工作。

      上次编辑 - 结束

      我所做的是更改了任务设置:检查了Run with highest privileges。在运行python [script path] 时,任务开始完美运行。 但请记住,该标题在开头包含“管理员:”...总是...

      附:感谢大家指出子流程是一个问题。这让我想到了任务设置。 当一个脚本从 Windows 任务计划程序运行时,我遇到了类似的问题,而另一个没有。 在 Windows 8.1 Embedded x64 上使用 python [script path] 运行 cmd 对我不起作用。不知道为什么。可能是因为需要在路径中有空格和引号问题。 希望我的回答对某人有所帮助。 ;)

      【讨论】:

      • 你的意思是这样的?
      【解决方案6】:

      创建一个批处理文件将您的 python 脚本添加到您的批处理文件中,然后安排该批处理文件。它将工作。 示例:假设您的 python 脚本位于文件夹 c:\abhishek\script\merun.py 首先你必须通过 cd 命令进入目录。所以你的批处理文件会是这样的:

      cd c:\abhishek\script python merun.py

      它对我有用。

      【讨论】:

        【解决方案7】:

        将其留给后代:我遇到的一个类似问题已通过在我的 .bat 和 .py 脚本中使用 UNC (\10.x.xx.xx\Folder\xxx) 路径而不是分配给的字母来解决驱动器(\K:\Folder\xxx)。

        【讨论】:

          【解决方案8】:

          我之前遇到过这个问题。我能够在 Windows 任务计划程序中手动运行该任务,但不能自动运行。我记得另一个用户对时间进行了更改,也许这个更改导致任务调度程序出错。我不知道。因此,我为同一个脚本创建了另一个名称不同的任务,并且该脚本自动运行。尝试创建一个运行相同脚本的测试任务。希望这行得通!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-02-11
            • 1970-01-01
            • 2020-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-20
            相关资源
            最近更新 更多