Ich bin mir nicht sicher, ob jemand darauf gestoßen ist, aber ich werde Vorschläge zur Fehlerbehebung und / oder zu alternativen Methoden machen.

Ich habe einen Windows 2008-Server, auf dem mehrere geplante Aufgaben ausgeführt werden. Eine dieser Aufgaben ist ein Python-Skript, das sich mit pscp bei einer Linux-Box anmeldet, nach neuen Dateien sucht und diese, falls neu, in ein lokales Verzeichnis auf dem Laufwerk C: kopiert. Ich habe mich auch an wichtigen Stellen in das Skript eingeloggt und verwende logging.basicConfig(level=DEBUG).

Ich habe den Befehl mit der Variablen command = 'pscp -pw xxxx name@ip:/ c:\local_dir' erstellt und dann mit subprocess.call(command) den Befehl ausgeführt.

Hier ist der seltsame Teil. Wenn ich das Skript manuell über die Befehlszeile ausführe, funktioniert es einwandfrei. Neue Dateien werden heruntergeladen und verarbeitet. Wenn der Taskplaner das Skript jedoch ausführt, werden keine neuen Dateien heruntergeladen. Das Skript wird unter demselben Benutzer ausgeführt, liefert jedoch unterschiedliche Ergebnisse.

Gemäß den vom Skript und auf der Linux-Box erstellten Protokolldateien meldet sich das Skript erfolgreich bei der Linux-Box an. Es werden jedoch keine Dateien heruntergeladen, obwohl neue Dateien vorhanden sind. Wenn ich es wieder über die Befehlszeile ausführe, werden Dateien heruntergeladen.

Irgendwelche Ideen? Vorschläge, alternative Methoden?

Vielen Dank.

12
user1070061 25 Nov. 2013 im 18:51

6 Antworten

Beste Antwort

Ich hatte das gleiche Problem beim Versuch, eine MS Access-Datenbank auf einer Linux-VM zu öffnen. Das Ausführen des Skripts an der Windows 7-Eingabeaufforderung funktionierte, das Ausführen im Taskplaner jedoch nicht. Mit Task Scheduler würde es die Datenbank finden und überprüfen, ob sie existiert, aber die darin enthaltenen Tabellen nicht zurückgeben.

Die Lösung bestand darin, den Taskplaner cmd als Programm / Skript mit den Argumenten / c Python C: \ Pfad \ zu \ script.py ausführen zu lassen (unter Argumente hinzufügen (optional) )).

Ich kann dir nicht sagen, warum das funktioniert, aber es hat mein Problem gelöst.

13
Brad Posthumus 14 Jän. 2014 im 15:10

Erstellen Sie eine Batch-Datei. Fügen Sie Ihr Python-Skript in Ihre Batch-Datei ein und planen Sie dann die Batch-Datei. Es wird funktionieren. Beispiel: Angenommen, Ihr Python-Skript befindet sich im Ordner c: \ abhishek \ script \ merun.py. Zuerst müssen Sie mit dem Befehl cd in das Verzeichnis wechseln. Ihre Batch-Datei lautet also wie folgt:

Cd c: \ abhishek \ script python merun.py

Es funktioniert für mich.

0
abhishek 4 Okt. 2018 im 05:19

Ich habe ein ähnliches Problem. Beim Testen habe ich festgestellt, dass jede Art von Aufruf mit Unterprozess das Python-Skript stoppt, wenn es im Taskplaner ausgeführt wird, aber gut funktioniert, wenn es in der Befehlszeile ausgeführt wird.

import subprocess

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

Bei der Ausführung über die Befehlszeile wird Folgendes ausgegeben:

Start
First call finished

Beim Ausführen vom Taskplaner lautet die Ausgabe:

Start

Um die Ausgabe vom Taskplaner zu erhalten, führe ich das Python-Skript wie folgt aus einer Batchdatei aus:

python test.py >> log.txt

Ich führe das Skript über die Batchdatei sowohl in der Befehlszeile als auch über den Taskplaner aus.

4
Steve 6 Dez. 2013 im 00:25

Sie können den Windows-Taskplaner verwenden, stellen Sie jedoch sicher, dass das Feld "Optional" "Start In" ausgefüllt ist.

Fügen Sie in der Taskplaner-App eine Aktion hinzu, die Ihre Python-Datei zum Ausführen von "doSomeWork" angibt, und füllen Sie die Eingabe Start in (optional) mit dem Verzeichnis aus, das die Datei enthält. Wenn Sie also beispielsweise eine Python-Datei in haben:

C:\pythonProject\doSomeWork.py

Sie würden eingeben:

Program/Script: doSomeWork.py

Start in (optional): C:\pythonProject 
9
Erkin Djindjiev 28 Jän. 2019 im 22:22

Letzte Bearbeitung - Start

Nach Experimenten ... Wenn Sie dort den vollständigen Pfad zum Python-Programm angeben, funktioniert es ohne höchste Berechtigungen (als Administrator). Bedeutung Aufgabeneinstellungen wie folgt:

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

Ich habe keine Ahnung warum, aber es funktioniert auch, wenn das Skript einen Unterprozess und mehrere Threads verwendet.

Letzte Bearbeitung - Ende

Ich habe die Aufgabeneinstellungen geändert: Run with highest privileges aktiviert. Und die Aufgabe begann perfekt zu funktionieren, während python [script path] ausgeführt wurde. Aber denken Sie daran, dieser Titel enthält zu Beginn "Administrator:" ... immer ...

P.S. Vielen Dank, dass Sie darauf hingewiesen haben, dass der Teilprozess ein Problem ist. Ich musste an Aufgabeneinstellungen denken. Ich hatte ein ähnliches Problem, wenn ein Skript über den Windows Task Scheduler ausgeführt wird und ein anderes nicht. Das Ausführen von cmd mit python [script path] funktionierte unter Windows 8.1 Embedded x64 nicht. Nicht sicher warum. Wahrscheinlich wegen der Notwendigkeit, Leerzeichen im Pfad zu haben und Anführungszeichen zu setzen. Hoffe meine Antwort hilft jemandem. ;)

0
Constantine Ketskalo 8 Sept. 2018 im 21:58

Brads Antwort ist richtig. Der Unterprozess benötigt den Shell-Kontext, um zu funktionieren, und der Task-Manager kann Python ohne diesen starten. Eine andere Möglichkeit besteht darin, eine Batchdatei zu erstellen, die vom Taskplaner gestartet wird, der Python c: \ path \ to \ script.py usw. aufruft. Der einzige Unterschied besteht darin, dass Sie auf ein Skript stoßen, das einen Aufruf hat Bei os.getcwd () erhalten Sie immer den Stamm, in dem sich das Skript befindet, aber Sie erhalten etwas anderes, wenn Sie cmd vom Taskplaner aus aufrufen.

1
citizen2191629 14 Jän. 2014 im 15:28