2013-11-25 1 views
7

누군가가이 문제를 겪었는지 확실하지 않지만 문제 해결 및/또는 대체 방법에 대한 제안을하겠습니다.pscp를 수행하는 Windows 작업 스케줄러로 python 스크립트를 실행하는 데 문제가 있습니다.

나는 여러 개의 예약 된 작업을 실행중인 Windows 2008 서버가 있습니다. 이러한 작업 중 하나는 pscp를 사용하여 Linux 상자에 로그인하고 새 파일을 검사하며 새로운 것이 있으면 C : 드라이브의 로컬 디렉토리에 복사하는 python 스크립트입니다. 요점에서 스크립트에 일부 로깅을 넣었고 logging.basicConfig(level=DEBUG)을 사용하고 있습니다.

변수를 사용하여 명령을 작성한 후에 command = 'pscp -pw xxxx [email protected]:/ c:\local_dir'을 입력 한 다음 subprocess.call(command)을 사용하여 명령을 실행합니다.

이제 이상한 부분이 있습니다. 명령 줄에서 스크립트를 수동으로 실행하면 정상적으로 작동합니다. 새 파일이 다운로드되고 처리됩니다. 그러나 작업 스케줄러에서 스크립트를 실행하면 새 파일이 다운로드되지 않습니다. 스크립트는 동일한 사용자로 실행되지만 다른 결과가 나타납니다.

스크립트 및 Linux 상자에서 작성된 로그 파일에 따르면 스크립트는 Linux 상자에 성공적으로 기록됩니다. 그러나 새 파일이 있어도 파일이 다운로드되지 않습니다. 다시 명령 줄을 통해 실행하면 파일이 다운로드됩니다.

아이디어가 있으십니까? 제안, 대체 방법?

감사합니다.

+0

감사합니다. 둘 다 옳다는 것이 밝혀졌습니다. 작업 스케줄러는 다음 두 가지 방법으로 이상합니다. 그것은 매핑 된 드라이브를 좋아하지 않습니다. 그것은 UNC 참조와 잘 작동합니다. 둘째; 그것은 모든 것에 대한 전체 경로 참조를 좋아합니다. 파일, 명령, 스크립트 내의 구문, 모든 것. 사실,이 두 가지 기술을 사용하면 어떻게 문제를 해결할 수 있습니다. 이제는 내 유일한 문제는 두 가지 모두 작동하기 때문에 어떤 답이 올바른지 결정하는 것입니다. – user1070061

답변

9

Linux VM에서 MS Access 데이터베이스를 열 때 동일한 문제가 발생했습니다. Windows 7 명령 프롬프트에서 스크립트를 실행했지만 작업 스케줄러에서 실행하지는 않았습니다. 작업 스케줄러를 사용하면 데이터베이스를 찾아서 존재하는지 확인하지만 테이블을 반환하지는 않습니다.

솔루션은 작업 스케줄러/C 파이썬 C 인수 와 프로그램/스크립트로 cmd를 실행하는 것이 었습니다 : \ 경로 \ \하기를 script.py (아래 추가 인수 (옵션)).

왜이 기능이 작동하는지는 알 수 없지만 문제가 해결되었습니다.

+0

매력처럼 작동합니다 !!!! –

+3

이것은 나를 위해 작동하지 않습니다. 내가 시도 할 때마다 나는 Run을 누를 때 아무 것도하지 않는다. > :( – endolith

+0

성가신 "taskeng.exe"창이 스크립트가 실행될 때마다 팝업되지 않게하려면 어떻게해야합니까 (내 스크립트는 매 15 분마다 실행됩니까?). – Danijel

1

비슷한 문제가 있습니다. 테스트에서 나는 모든 유형의 호출이 태스크 스케줄러에서 실행될 때 파이썬 스크립트를 중지하지만 명령 행에서 실행될 때 제대로 작동 함을 발견했습니다.

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 

명령 줄과 작업 스케줄러를 통해 배치 파일을 통해 스크립트를 실행합니다.

1

브래드 대답이 맞습니다. 서브 프로세스가 작동하려면 쉘 컨텍스트가 필요하고 태스크 매니저는 파이썬을 시작하지 않아도된다. 또 다른 방법은 파이썬 c : \ path \ to \ script.py 등을 호출하는 태스크 스케줄러가 실행하는 배치 파일을 만드는 것입니다.이 유일한 차이점은 호출 스크립트가있는 경우 os에.getcwd() 당신은 항상 스크립트가있는 루트를 얻을 것이지만 태스크 스케줄러로부터 cmd를 호출 할 때 다른 것을 얻는다.

1

windows 이벤트 스케줄러를 사용할 수 있습니다. "doSomeWork"를 실행할 파이썬 파일을 지정하고 파일 (예 : 파이썬 파일이있는 경우)을 입력하십시오.

C : \ pythonProject \ doSomeWork.py는

다음을 입력 :

프로그램/스크립트 : doSomeWork.py (선택 사항)에서

시작 : C를 : pythonProjects \ 이러한 답변을

관련 문제