2015-01-27 3 views
0

나는 subprocess.call()을 사용하여 .ksh 스크립트를 실행하기 위해 Python을 사용하고 있습니다.Python에서 KSH 스크립트로 값을 전달

이 스크립트는 사용자가 특정 시점에 텍스트를 입력하도록 요구합니다. 파이썬의 input()과 동등한 것이 KSH에 있습니다.

문제는 제가 스크립트를 ~ 200 번 실행해야한다는 것입니다. 매번이 정보를 입력하고 싶지 않습니다. 어쨌든 나는 사용자 입력에 대한 이러한 요청이 사용자가 아무 것도하지 않고도 자동으로 값을 제공하도록 설정할 수 있습니까?

저는이 방법으로 셸에서 파이썬을 사용하는 데 매우 익숙합니다.이 질문이 의미가 없으면 사과합니다. 어떤 의견이라도 기쁘게 생각합니다. 이전에 질문 한이 질문을 발견하지 못했습니다. 대부분 사람들이 스크립트에 인수를 전달하는 것에 대해 질문합니다. 그러나 주요 검색어를 찾는 데 어려움을 겪었을 때 뭔가를 놓친 것 같습니다.

파이썬 버전은 2.7이며 UNIX 환경입니다.

+1

'stdin'에서 스크립트에 데이터를 입력해야합니다. 하위 프로세스 모듈을 사용하면이를 수행 할 수 있습니다. –

+0

스크립트를 수정할 수 있습니까? 그 표준에 쓰는 것은 확실히 가능하지만, stdin - 환경 변수, 명령 행 인자 외의 수단을 통해 인수가 전달되도록 호출 규칙을 변경하는 것이 더 좋습니다. –

답변

0
  1. 매개 변수를 파이썬으로 저장하고 스크립트를 호출 할 때마다 명령 줄에서 지정할 수 있습니다.

  2. 스크립트는 파일 (또는 데이터베이스, 서비스, ..)에 저장할 수 있으며 다시 시작할 때 읽을 수 있습니다.

0

파이썬의 input() ksh를 포함한 모든 POSIX 호환 쉘에서에 상응하는, read입니다.


따라서, 파이썬 측 :

p = subprocess.Popen(['yourscript'], stdin=subprocess.PIPE) 
p.communicate(arg1 + '\n' + arg2 + '\n') 

... 쉘 측 :

IFS= read -r arg1 
IFS= read -r arg2 

IFS을 삭제하고 -r을 통과 때문에, 해석이 더 밀접하게 문자 확인 예를 들어, 파이썬 측에있는 두 개의 문자 \n을 포함하는 문자열은 하나의 개행 문자 만 포함하는 것으로 해석되지 않으며, avoi 트랜잭션의 셸 끝에서 후행 공백을 자동으로 제거합니다.


당신의 문자열은 줄 바꿈을 포함 할 수 있으며, 그런 다음 당신은 후행 NUL 문자로 파이썬 프로그램을 방출 할 것입니다 경우

p = subprocess.Popen(['yourscript'], stdin=subprocess.PIPE) 
p.communicate(arg1 + '\0' + arg2 + '\0') 

... 그리고 그래서에서 읽어 쉘 끝 :

IFS= read -r -d '' arg1 
IFS= read -r -d '' arg2 

이것은 임의의 C 문자열을 처리 할 수 ​​있기 때문에 당신이 요청한 input() 상응하는보다 더 강력하다. (파이썬의 네이티브 문자열은 파스칼 스타일이기 때문에 리터럴 NUL을 포함 할 수 있습니다. ksh 나 다른 기존 POSIX 스타일의 쉘은 매우 불쾌한 트릭을 사용하지 않고 말 그대로 모든 값을 처리 할 수 ​​없습니다).


는 일반적으로 오히려 당신이 제안으로 표준 입력에서 읽는 것보다, 명령 줄이나 환경을 통해 인수를 전달하는 좋은 연습이 될 것이라고 말했다.따라서 : arg1arg2 당신이 다음 스크립트 $1$2이라 할 수있는, 전달하고자하는 내용으로 변수
subprocess.Popen(['yourscript', arg1, arg2], shell=False) 

.... 또는, 변수는 환경을 통해 전달 될 수있는 다음 ksh 스크립트가 값을 "$arg1""$arg2"를 직접 참조 할 수있는 경우에

subprocess.Popen(['yourscript'], shell=False, env={ 
    'arg1': arg1, 
    'arg2': arg2, 
}) 

을 ....


스크립트가 현재 실행되는 장소를 찾는 생각해없는 경우에만 표준 입력 arg1에서 값을 읽을 것이다 ...

read arg1 

[[ $arg1 ]] || read arg1 

로 교체 다른 값은 이미 (환경을 통해) 제공되었습니다. 따라서 항상 대화 형으로 명령 줄을 통해 사용자에게 대화 형으로 프롬프트를 표시하는 스크립트를 사용할 수 있지만 환경에서 직접 내용을 읽는 대체 동작을 제공합니다.