2012-09-27 3 views
0

Python의 하위 프로세스를 통해 명령을 실행하려고하는데 올바르게 실행되지 않습니다. 내가 쉘에 입력하는 경우 :Python Subprocess : 명령이 Python에서 실패하지만 쉘에서 작동합니다.

pack < packfile.dat 

pack 내 소프트웨어 및 packfile 입력 파일이고, 그 다음이 소프트웨어는 잘 실행됩니다.

import subprocess as sp 
import shlex 

cmd = 'pack < packfile.dat'.split() 
p = sp.Popen(cmd) 

소프트웨어는 불평 :

Pack must be run with: pack < inputfile.inp 

Reading input file... (Control-C aborts) 

을하고 거기 중단

나는 파이썬에서 이것을 시도하십시오.

이 마지막 부분은 내 소프트웨어에만 해당되지만 동일한 명령을 실행하는 두 가지 방법이 다른 결과를 나타냅니다.

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까? 이 모범 사례가 아닌 경우 나, 이것에 조금 새로운 오전부터

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE) 
stdout, stderr = p.communicate() 

은 알려 주시기 바랍니다 :

사실, 나는 결국 할 계획입니다.

미리 감사드립니다.

답변

1

"<"는 명령에 매개 변수 아니며, 하나로 전달해서는 안 :이 경우, 당신은 아마 그것을 달성 할 수있다.

시도 :

p = sp.Popen(cmd,stdout=sp.PIPE,stderr=sp.PIPE, stdin=open('packfile.dat')) 
+0

감사합니다. (답변과 설명을 모두 제공) – Tetsuo

4

I/O 리디렉션은 셸의 제품이며 기본적으로 Popen은 셸을 사용하지 않습니다. 이 시도 : 거기에서

p = sp.Popen(cmd, shell=True) 

subprocess.Popen() IO redirect

당신은 또한 일부는 쉘 옵션을 선호하지 않는 것을 볼 수 있습니다.

with open('input.txt', 'r') as input: 
    p = subprocess.Popen('./server.py', stdin=input) 
+0

감사합니다, 나는 그것을 감사드립니다. 나는 쉘 = True로 시도했지만, 불행히도이 방법은 효과가 없었다. 다른 답변에 따르면, "<"는이 방법으로 사용할 수 없습니다. – Tetsuo

1

이 시도 : 귀하의 빠른 회신

import subprocess as sp 
p = sp.Popen(['pack'], stdin = open('packfile.dat', 'r')) 
+0

감사합니다! 매우 도움이됩니다! – Tetsuo

관련 문제