执行pscp的windows任务调度程序运行python脚本时出现问题



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

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

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

现在是奇怪的部分。如果我从命令行手动运行脚本,它运行得很好。下载并处理新文件。但是,如果任务调度器运行脚本,则不会下载新文件。该脚本在同一用户下运行,但会产生不同的结果。

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

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

谢谢。

您可以使用windows任务调度程序,但请确保填写了"可选"字段"启动"。

在Task Scheduler应用程序中,添加一个操作,指定您的python文件运行"doSomeWork",并使用包含该文件的目录填写Start In(可选)输入。。例如,如果您在中有一个python文件

C:pythonProjectdoSomeWork.py

您将输入:

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

我在Linux虚拟机上打开MS Access数据库时遇到了同样的问题。在Windows7命令提示符下运行该脚本有效,但在任务计划程序中运行该脚本无效。使用任务调度程序,它会找到数据库并验证其存在,但不会返回其中的表

解决方案是让任务调度程序运行cmd作为程序/脚本,参数为/c python c:\path\to\Script.py(在添加参数(可选)下)。

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

我也遇到了类似的问题。在测试中,我发现任何类型的带有子进程的调用在任务调度程序中运行时都会停止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

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

Brad的回答是正确的。子进程需要shell上下文才能工作,任务管理器可以在没有shell上下文的情况下启动python。另一种方法是制作一个批处理文件,该文件由调用python c:\path\to\script.py等的任务调度程序启动。唯一的区别是,如果你遇到一个调用os.getcwd()的脚本,你总是会得到脚本所在的根,但当你从任务调度程序调用cmd时,你会得到其他东西。

上次编辑-启动

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

program: "C:Program FilesPython37python.exe"
arguments: "D:folderfolderpython script.py"

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

上次编辑-结束

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

附言:感谢各位指出子流程是个问题。这让我想到了任务设置。当一个脚本从Windows任务调度程序运行时,我遇到了类似的问题,而另一个脚本没有。在Windows 8.1 Embedded x64上使用python [script path]运行cmd对我不起作用。不知道为什么。可能是因为路径中必须有空格,并且有引号的问题。希望我的回答能帮助到别人

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

cd c:\abhishek\scriptpython-merun.py

它对我有用。

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

我以前遇到过这个问题。我可以在Windows任务计划程序中手动运行该任务,但不能自动运行。我记得另一个用户更改了时间,也许这个更改导致任务调度程序出错。我不确定。因此,我为同一个脚本创建了另一个具有不同名称的任务,该脚本自动工作。尝试创建一个运行相同脚本的测试任务。希望这能奏效!

对于Anaconda,在以下窗口中安装python解决方案对我有效

  1. 使用以下内容创建批处理文件"C: \Users\username\Anaconda3\condabin\activate"amp&python";script.py"&停用
  2. 运行此批处理文件的安装任务

最新更新