运行python脚本的问题由执行pscp的Windows任务调度程序运行

时间:2013-11-25 14:51:18

标签: python scheduled-tasks scp

不确定是否有人遇到此问题,但我会采取排查和/或替代方法的建议。

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

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

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

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

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

感谢。

6 个答案:

答案 0 :(得分:13)

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

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

我无法告诉你为什么会这样,但它解决了我的问题。

答案 1 :(得分:5)

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

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

C:\pythonProject\doSomeWork.py

您可以输入:

Program/Script: doSomeWork.py

Start in (optional): C:\pythonProject 

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

最后编辑-开始

经过实验...如果您在其中放置python程序的完整路径,则无需最高权限即可工作(以admin身份)。含义如下的任务设置:

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

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

最后编辑-结束

我要做的是更改任务设置:选中Run with highest privileges。运行python [script path]时,任务开始正常运行。 但是请记住,该标题一开始包含“ Administrator:”……始终……

P.S。谢谢大家指出子流程是个问题。这让我想到了任务设置。 当一个脚本从Windows Task Scheduler运行而另一个脚本没有运行时,我遇到了类似的问题。 在Windows 8.1 Embedded x64上,用python [script path]运行cmd对我不起作用。不知道为什么。可能是因为必须在路径中留有空格并用引号引起来。 希望我的回答对某人有帮助。 ;)

答案 5 :(得分:0)

创建一个批处理文件,将python脚本添加到该批处理文件中,然后计划该批处理文件。它将起作用。 示例:假设您的python脚本位于文件夹c:\ abhishek \ script \ merun.py中 首先,您必须使用cd命令进入目录。因此,您的批处理文件将如下所示:

cd c:\ abhishek \ script python merun.py

对我有用。