2012-02-17 3 views
3

파이썬으로 서브 프로세스로 시작하는 프로그램 (MolPro)에 파일을 전달하려고합니다.파이썬 문자열을 서브 프로세스의 파일 인수로 사용

그것은 가장 일반적으로 콘솔에서 다음과 같이 인수로 파일을 취

filename.ex 실행하는 코드를 포함
path/molpro filename.ext 

. 양자 택일로 bash 스크립트 (내가 뭘하려고하지만 파이썬에서) :

#!/usr/bin/env bash 
path/molpro << EOF 
    # MolPro code 
EOF 

나는 파이썬에서 위의 작업을하려고합니다.

from subprocess import Popen, STDOUT, PIPE 
DEVNULL = open('/dev/null', 'w') # I'm using Python 2 so I can't use subprocess.DEVNULL 
StdinCommand = ''' 
    MolPro code 
''' 

# Method 1 (stdout will be a file) 
Popen(['path/molpro', StdinCommand], shell = False, stdout = None, stderr = STDOUT, stdin = DEVNULL) 
# ERROR: more than 1 input file not allowed 

# Method 2 
p = Popen(['path/molpro', StdinCommand], shell = False, stdout = None, stderr = STDOUT, stdin = PIPE) 
p.communicate(input = StdinCommand) 
# ERROR: more than 1 input file not allowed 

그래서 내가 입력 파일처럼 충분히 보이지 않는 확신하지만, 심지어 내가 임 잘못하고 찾을 수없는 Python - How do I pass a string into subprocess.Popen (using the stdin argument)?보고 : 나는이 시도했다.

내가하지에 선호 :

  • 이 True
  • (내가 MolPro 코드를 변경할 수 없습니다)

덕분에

  • 세트 쉘 실제 파일에 문자열 쓰기 어떤 도움을 많이!

    업데이트 : 다른 사람이 똑같이하려는 경우, 작업이 완료 될 때까지 기다리지 않으려면 (아무런 답도 반환하지 않음) 대신 p.stdin.write(StdinCommand)을 사용하십시오.

  • +2

    왜 텍스트의 거대한 블록을 제공하기 위해 노력하고있다'StdinCommand' 실제 명령 줄에서? 방법 2는 stdin에 텍스트를 제공합니다. 왜 커맨드 라인에서 그것을 반복하고 있습니까? –

    +0

    실수로 1 시간 정도 내려다 보았습니다. :-) – Mark

    답변

    8

    당신이 Popen() 인수에서 StdinCommand를 제거하면 두 번째 방법은 작동해야처럼 보인다 :

    p = Popen(['/vol/thchem/x86_64-linux/bin/molpro'], shell = False, stdout = None, stderr = STDOUT, stdin = PIPE) 
    p.communicate(input = StdinCommand) 
    
    +0

    나는 그것을 보지 못해서 지쳐 보일 수도 있습니다 :-) 그것은 작동합니다, 빠른 답장을 보내 주셔서 감사합니다! – Mark

    관련 문제