파이썬의 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 스타일의 쉘은 매우 불쾌한 트릭을 사용하지 않고 말 그대로 모든 값을 처리 할 수 없습니다).
는 일반적으로 오히려 당신이 제안으로 표준 입력에서 읽는 것보다, 명령 줄이나 환경을 통해 인수를 전달하는 좋은 연습이 될 것이라고 말했다.따라서 :
arg1
및
arg2
당신이 다음 스크립트
$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
로 교체 다른 값은 이미 (환경을 통해) 제공되었습니다. 따라서 항상 대화 형으로 명령 줄을 통해 사용자에게 대화 형으로 프롬프트를 표시하는 스크립트를 사용할 수 있지만 환경에서 직접 내용을 읽는 대체 동작을 제공합니다.
'stdin'에서 스크립트에 데이터를 입력해야합니다. 하위 프로세스 모듈을 사용하면이를 수행 할 수 있습니다. –
스크립트를 수정할 수 있습니까? 그 표준에 쓰는 것은 확실히 가능하지만, stdin - 환경 변수, 명령 행 인자 외의 수단을 통해 인수가 전달되도록 호출 규칙을 변경하는 것이 더 좋습니다. –