2013-11-25 14 views
7

Nie jestem pewien, czy ktoś go uruchomił, ale przyjmuję sugestie dotyczące rozwiązywania problemów i/lub metod alternatywnych.Problemy z uruchamianiem skryptu Pythona przez program do planowania zadań systemu Windows, który wykonuje polecenie pscp

Mam serwer Windows 2008, na którym uruchamiam kilka zaplanowanych zadań. Jednym z tych zadań jest skrypt w języku Python, który używa protokołu pscp do logowania do systemu Linux, sprawdza nowe pliki i jeśli jest coś nowego, kopiuje je do lokalnego katalogu na dysku C :. Zanotowałem również logowanie do skryptu w kluczowych punktach i używam logging.basicConfig(level=DEBUG).

Zbudowałem polecenie, używając zmiennej, command = 'pscp -pw xxxx [email protected]:/ c:\local_dir', a następnie używam subprocess.call(command) do wykonania polecenia.

Oto część dziwna. Jeśli uruchomię skrypt ręcznie z linii poleceń, działa dobrze. Nowe pliki są pobierane i przetwarzane. Jeśli jednak Task Scheduler uruchomi skrypt, żadne nowe pliki nie zostaną pobrane. Skrypt działa pod tym samym użytkownikiem, ale przynosi różne wyniki.

Zgodnie z plikami dziennika utworzonymi przez skrypt i na pudełku Linux, skrypt pomyślnie loguje się do Linux-a. Jednak żadne pliki nie są pobierane pomimo istnienia nowych plików. Ponownie, gdy uruchomię go za pomocą wiersza poleceń, pliki zostaną pobrane.

Wszelkie pomysły? sugestie, alternatywne metody?

Dzięki.

+0

Dzięki za te odpowiedzi. Okazuje się, że oboje macie rację. Harmonogram zadań jest dziwny na dwa sposoby: Pierwszy; nie lubi mapowanych dysków. Działa dobrze z referencjami UNC. Druga; dla wszystkich lubi pełne odwołanie do ścieżki. Pliki, polecenia, składnia w skryptach, wszystko. W rzeczywistości, używając tych dwóch technik, naprawiłem mój problem. Teraz moim jedynym problemem jest ustalenie, która odpowiedź na kliknięcie jest poprawna, ponieważ oba działają. – user1070061

Odpowiedz

9

Miałem ten sam problem podczas próby otwarcia bazy danych MS Access na maszynie wirtualnej Linux. Uruchomienie skryptu w wierszu polecenia systemu Windows 7 zadziałało, ale nie uruchomiono go w Task Scheduler. Z Task Scheduler znalazłby bazę danych i zweryfikuje ją, ale nie zwróci tabel w niej.

Roztwór mieć harmonogramu zadań prowadzony cmd jako program/Script z argumentami /C pyton C: \ ścieżka \ z \ script.py (w dodanie argumentów (opcjonalnie)).

Nie mogę powiedzieć, dlaczego to działa, ale rozwiązał mój problem.

+0

Działa jak urok !!!! –

+3

to też nie działa. wszystko, co próbuję, nie robi nic, gdy naciskam Run. > :( – endolith

+0

Jak mogę zapobiec wyświetlaniu irytującego okna "taskeng.exe" za każdym razem, gdy wykonywany jest skrypt (mój skrypt jest uruchamiany co 15 minut)? – Danijel

1

Mam podobny problem. Podczas testów odkryłem, że każdy rodzaj wywołania z podprocesowaniem zatrzymuje skrypt Pythona po uruchomieniu w harmonogramie zadań, ale działa poprawnie po uruchomieniu w wierszu poleceń.

import subprocess 

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

po uruchomieniu na linii poleceń to wyjścia:

Start 
First call finished 

Po uruchomieniu z harmonogramu zadań wyjście jest:

Start 

W celu uzyskania wyjście z harmonogramu zadań uruchomić skrypt python z pliku wsadowego w następujący sposób:

python test.py >> log.txt 

Uruchamiam skrypt przez plik wsadowy zarówno w linii poleceń, jak i poprzez harmonogram zadań.

1

Odpowiedź Brada jest właściwa. Podproces potrzebuje do działania kontekstu powłoki, a menedżer zadań może bez niego uruchamiać pythona. Innym sposobem na zrobienie tego jest utworzenie pliku wsadowego uruchamianego przez program do planowania zadań, który wywołuje python c: \ path \ to \ script.py itd. Jedyna różnica polega na tym, że jeśli uruchomisz skrypt, który ma połączenie do os.getcwd() zawsze otrzymasz katalog główny skryptu, ale otrzymasz coś innego, gdy wykonasz wywołanie cmd z harmonogramu zadań.

1

Możesz użyć programu do planowania zdarzeń systemu Windows. Dodaj akcję, która określa plik Pythona, aby uruchomić "doSomeWork" i wprowadź dane wejściowe początkowe (opcjonalne) w katalogu, który zawiera plik. Na przykład, jeśli masz plik python w:

C: \ pythonProject \ doSomeWork.py

należy wpisać:

Program/skrypt: doSomeWork.py

start w (opcjonalnie): C: \ pythonProjects

Powiązane problemy