2017-01-14 1 views
0

저는 Windows 컴퓨터에있는 bash 스크립트를 실행할 python 스크립트를 작성하려고합니다. 지금까지 나는 Cygwin 터미널을 사용하여 bash 스크립트 RunModels.scr을 실행 했으므로 ./RunModels.scr처럼 쉽습니다. 이제는 subprocess의 Python을 사용할 수 있기를 원하지만, Windows에는 bash를 처리 할 수있는 기능이 없기 때문에 무엇을해야할지 모르겠습니다. 나는 원래 쓴 ./RunModels.scr <validationInput> validationOutputWindows의 Python에서 bash 스크립트를 실행하십시오.

모방하려고

이 :

os.chdir(atm) 
vin = open("validationInput", 'r') 
vout = open("validationOutput", 'w') 
subprocess.call(['./RunModels.scr'], stdin=vin, stdout=vout, shell=True) 
vin.close() 
vout.close() 
os.chdir(home) 

하지만 내 액세스가 거부 된 이유를 알아 내려고 잠시 지출 후, 나는 내 문제는 파일이 아닙니다 실현 퍼미션 (permission)하지만, 일반적으로 Windows에서 bash 파일을 실행하려고 시도했다는 사실. 누군가가 파이썬 스크립트를 사용하여 Windows에서 입출력을 지시하는 bash 스크립트를 실행하는 방법을 설명해 주시겠습니까?

편집 (후속 질문) : 응답에 대한

덕분에, 나는 처음 PARAM로 내 bash.exe의 전체 경로를 필요로했다. 이제 RunModels.scr 내에서 명령 줄 호출은 파이썬 출력에 command not found으로 돌아옵니다. 예를 들어, ls, cp, make. 이것에 대한 제안?

# 2을 따르 나는이 내 전화를 업데이트 : 지금 얻을

subprocess.call(['C:\\cygwin64\\bin\\bash.exe', '-l', 'RunModels.scr'], stdin=vin, stdout=vout, cwd='C:\\path\\dir_where_RunModels\\')

오류가 /usr/bin/bash: RunModels.scr: No such file or directory입니다. cwd를 사용하면이 오류에 아무런 영향을 미치지 않는 것 같습니다. 서브 프로세스가 /usr/bin/bash 인 경우 RunModels.scr을 찾습니다.

셀프 ANSWERED 나는 호출에 RunModels.scr의 경로를 지정뿐만 아니라 cwd를 사용하는 데 필요한 .

그러나 또 다른 문제

subprocess.call(['C:\\cygwin64\\bin\\bash.exe', '-l', 'C:\\path\\dir_where_RunModels\\RunModels.scr'], stdin=vin, stdout=vout, cwd='C:\\path\\dir_where_RunModels\\')

... RunModels.scr이 잘못된 디렉토리에있는 것처럼

는 관계없이 cwd를 지정, RunModels.scr에 의해 실행 명령이 오류를 던지고있다. 스크립트가 실행되지만 cpcdno such file or directory이라는 오류를 발생시킵니다. RunModels.scr이 명령 행을 통해 어디로 이동하면이 오류가 발생하지 않는 구식 방식으로 실행합니다.

+0

* bash * 스크립트이므로 Windows 경로 구문을 사용하여 전체 경로와 함께 bash 명령을 명시 적으로 호출해야합니다. –

+0

알림 : 파일을 열 때'with' 문을 사용하는 것이 더 좋습니다. 그렇게하면 예외가 발생할 때 열어 두지 않게됩니다. –

답변

2

subprocess.call 개의 목록에 bash.exe을 넣으십시오. 이 경우에는 필요하지 않은 shell=True을 삭제할 수 있습니다.

subprocess.call(['C:\\cygwin64\\bin\\bash.exe', '-l', 'RunModels.scr'], 
       stdin=vin, stdout=vout, 
       cwd='C:\\path\\dir_where_RunModels\\') 

bash는 설치 방법에 따라 (가 PATH 여부에), 당신은 bash는 실행 파일의 전체 경로를 사용해야 할 수도 있습니다.

편집 : 두 번째 질문과 관련하여

, 당신은 그것을 /etc/profile처럼 모든 restart 명령 파일을 읽어 확인하기 위해 쉘 호출에 -l 옵션을 추가해야 할 수도 있습니다. 이 파일에는 bash의 $PATH에 대한 설정이 포함되어 있다고 가정합니다.

편집 2 :

RunModels.scr의 시작 부분에 pwd 같은 것을 추가 그래서 당신은 당신이 바로 그 디렉토리에 정말 것을 확인할 수 있습니다. rc 파일에 cd 명령이 없는지 확인하십시오!

편집 3 :

bash는 스크립트에서 호출되는 명령 중 하나를 찾을 수없는 경우 /usr/bin/bash: RunModels.scr: No such file or directory도 발생 할 수있는 오류입니다. 더 많은 정보를 제공하는지 보려면 bash에 -v 옵션을 추가하십시오.

+0

PATH 환경 변수에 있지 않으면 bash에 대한 전체 경로 (예 :'c : \\ cygwin \\ bin \\ bash.exe')를 제공해야합니다. –

+0

감사합니다. 전체 경로가 필요하고 실행이 효과적이었습니다. 나는 당신도 그걸 도울 수있는 경우 후속 질문으로 게시물을 업데이 트했습니다 : – WhS4

+0

@ WhS4 내 편집을 참조하십시오. –

관련 문제