2014-11-04 1 views
1

Python 코드에서 제 3 자 실행 파일을 관리하는 동안 이상한 동작이 있습니다.Windows cmd line과 python에서 호출하는 명령의 차이점

import subprocess 
p = subprocess.Popen([r'c:\path\to\programme.exe', '-d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = p.communicate() 
print p.returncode, out, err 

그리고 out의 역 추적에 표시하고, "처리되지 않은 예외"를 의미하는 오류 코드를 반환 도구의 충돌 : 개념적으로 파이썬에서 다음과 같은 코드가 있습니다. 나는 동일한 결과를 가진 간단한 os.system(...)으로 시도했다. 창문 쉘에 난 그냥 명령을 붙여 넣을 때

는하지만, 여기

C:\> c:\path\to\programme.exe -d 

파이썬 인터프리터는 32 비트 2.7.2 버전입니다 ... 그것은 완벽하게 작동, 재미있는 부분을 온다.

그래서 ... 충돌로 이어지는 두 가지 호출의 차이점은 무엇입니까? 미리 감사드립니다.

추가 정보를 원하시면이 도움이 있지만, 외부 도구는 데이터베이스에 연결하고 일부 작업을 수행하는 경우 내가 아주 확실하지 않다

. 일부 RDBMS에서는 파이썬 코드에서 호출 할 때 작동하지만 Oracle DB에 연결하면 충돌합니다. 그래서 파이썬 코드가 옳은 것 같습니다. 모르는 요소 나 차이가 있습니다.

+0

나는 폐회표에 대한 설명을 부탁드립니다. – bgusach

+0

테스트 할만한 일반적인 것들 : IO (stdin being closed), evnironment.가장 쉬운 테스트는 cmd 내에서 (대화식으로) Python을 시작하고 동일한 코드를 실행하는 것입니다. –

+0

이미 REPL에서 명령을 실행하려고 시도했지만 작동하지 않습니다. x64/x86 차이가있을 수 있습니까? 나는 그다지 잘하지 않습니다. 고마워. – bgusach

답변

2

글쎄, 당신은 정말 많은 정보를 제공하지는. 나는 이와 같은 상황을 다루는 자신의 경험을 바탕으로 추측을 할 것입니다.

  1. 타사 앱에 priveleges가 필요한 경우 관리자로 Python 앱을 실행하고 있는지 확인하십시오.

  2. 작업 디렉토리에 문제가 없는지 확인하십시오. 의미, 프로그램이 어떤 파일을 열거 나 어떤 상대 경로를 참조하는 경우, 파이썬에서 실행할 때 작업 디렉토리를 변경해야합니다. 이 작업을 수행하는 방법은 아래 코드를 참조하십시오.

  3. 당신이 실행하고있는 programm에가 내장 윈도우 인 경우는 (... 등 DIR, 복사,) 응용 프로그램을 쉘 Popen 객체를 생성 할 때 shell=True을 사용하는 것이 좋습니다. Popen constructor 참조을 참조하십시오.

  4. 파이썬은 타사 응용 프로그램에서 필요로하거나 사용되는 환경 변수를 설정하거나 수정합니다.

실행중인 Python 응용 프로그램에서 작업 디렉토리를 변경하기위한 코드.

import os 
os.chdir('/path_you_need/python/work_from') 
+0

1) 문제가없는 cmd에서 작동하므로 권한이 필요하지 않습니다. 2) 경로는 절대적으로 문제가되지 않습니다. 3) 쉘 프로그램이 아니며 주어진 장소에서 주어진 실행 파일입니다. 그러나'shell = True'를 시도했지만 여전히 작동하지 않습니다. 결국 문제는 다음과 같이 요약됩니다. 명령을 직접 실행하는 것과 파이썬에서 서브 프로세스로 실행하는 것의 차이점은 무엇입니까? – bgusach

+0

@ ikaros45 더 깊이 생각하고 **이 앱 **을 직접 실행하는 것과 파이썬에서 서브 프로세스로 실행하는 것의 차이점은 무엇입니까? –

+0

내가 알고있는 특정 앱에 대한 차이점이 무엇인지는 묻지 않습니다. 그러므로 나는 직접 실행과 서브 프로세스 사이에서 어떤 차이가있을 수 있는지 묻는다. 현재는 환경 변수가 될 수있다. 도와 줘서 고마워, 고마워. – bgusach

0

raw string을 사용해야합니다.

p = subprocess.Popen([r'c:\path\to\programme.exe', '-d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

다른 대신이 같은 raw string을 사용하는 \\을 사용할 수 있습니다 : -

p = subprocess.Popen(['c:\\path\\to\\programme.exe', '-d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
+0

고마워,하지만 그건 문제가되지 않습니다. 문자열은 프로그래밍 방식으로 생성됩니다 ... 리터럴은 예제 일뿐입니다. – bgusach

+0

@ ikaros45 무엇이 오류였습니까? –

+0

타사 도구가 반환하는 것은 문제가 아닙니다. 질문은 다음과 같습니다. 호출의 차이점은 어디에 있습니까? – bgusach

관련 문제