2013-11-25 6 views
7

Nicht sicher, ob jemand in diese aufgetreten ist, aber ich nehme Vorschläge für die Fehlerbehebung und/oder alternative Methoden.Probleme beim Ausführen von Python-Skript von Windows-Task-Scheduler, die pscp

Ich habe einen Windows 2008 Server, auf dem ich mehrere geplante Aufgaben ausführen. Eine dieser Aufgaben ist ein Python-Skript, das pscp verwendet, um sich bei einer Linux-Box anzumelden, nach neuen Dateien zu suchen und diese, wenn es etwas Neues gibt, in ein lokales Verzeichnis auf dem Laufwerk C: zu kopieren. Ich habe ein paar Logging in das Skript an wichtigen Punkten und ich verwende logging.basicConfig(level=DEBUG).

Ich habe den Befehl mit einer Variablen command = 'pscp -pw xxxx [email protected]:/ c:\local_dir' erstellt und dann verwende ich subprocess.call(command), um den Befehl auszuführen.

Jetzt ist hier 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 ausführt, werden jedoch keine neuen Dateien heruntergeladen. Das Skript wird unter demselben Benutzer ausgeführt, führt jedoch zu unterschiedlichen Ergebnissen.

Gemäß den Protokolldateien, die vom Skript und der Linux-Box erstellt wurden, meldet sich das Skript erfolgreich in der Linux-Box an. Es werden jedoch keine Dateien heruntergeladen, obwohl neue Dateien vorhanden sind. Auch wenn ich es über die Befehlszeile ausführe, werden Dateien heruntergeladen.

Irgendwelche Ideen? Vorschläge, alternative Methoden?

Danke.

+0

Vielen Dank für diese Antworten. Es stellt sich heraus, dass Sie beide recht haben. Taskplaner ist auf zwei Arten seltsam: Erstens; Es mag keine gemappten Laufwerke. Es funktioniert gut mit UNC-Referenzen. Zweite; Es mag eine vollständige Pfadreferenz für alles. Dateien, Befehle, Syntax in Skripten, alles. Mit diesen beiden Techniken habe ich mein Problem gelöst. Jetzt ist mein einziges Problem, zu entscheiden, welche Antwort richtig zu klicken, da beide arbeiten. – user1070061

Antwort

9

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

Die Lösung wurde auf Taskplaner cmd als Programm/Skript mit den Argumenten /c Python C ausgeführt haben: \ path \ to \ script.py (unter Argumente hinzufügen (optional)).

Ich kann Ihnen nicht sagen, warum das funktioniert, aber es löste mein Problem.

+0

Funktioniert wie ein Charme !!!! –

+3

das funktioniert auch nicht für mich. alles was ich versuche, tut es nichts wenn ich Run drücke. > :( – endolith

+0

Wie verhindere ich, dass jedes Mal, wenn das Skript ausgeführt wird, ein nerviges "taskeng.exe" -Fenster angezeigt wird (mein Skript läuft alle 15 Minuten)? – Danijel

1

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

import subprocess 

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

Wenn in der Befehlszeile ausführen, um diese Ausgänge:

Start 
First call finished 

Wenn von Task-Scheduler laufen die Ausgabe lautet:

Start 

Um die Ausgabe von Task-Scheduler zu bekommen ich die laufen Python-Skript aus einer Batch-Datei wie folgt:

python test.py >> log.txt 

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

1

Brads Antwort ist richtig. Der Subprozess benötigt den Shell-Kontext 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: \ pfad \ zu \ script.py usw. aufruft. Der einzige Unterschied besteht darin, dass Sie ein Skript aufrufen, das einen Aufruf enthält zu os.getcwd() Sie erhalten immer die Wurzel, wo das Skript ist, aber Sie erhalten etwas anderes, wenn Sie den Aufruf von Taskplaner aus dem Cmd aufrufen.

1

Sie können den Windows-Ereignisplaner verwenden. Fügen Sie 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. Zum Beispiel wenn Sie eine Python-Datei haben:

C: \ pythonProject \ doSomeWork.py

würden Sie geben ein:

Programm/Skript: doSomeWork.py

Starten in (optional): C: \ pythonProjects

Verwandte Themen