Python에서 외부 프로그램 (실행 가능)을 실행하고 있습니까?


92

방금 Python 작업을 시작했고 Python에서 외부 실행 파일을 실행하려고했습니다.

Fortran으로 작성된 프로그램의 실행 파일이 있습니다. 실행 파일의 이름이 flow.exe라고 가정 해 보겠습니다. 그리고 내 실행 파일은 C:\Documents and Settings\flow_model. os.system과 popen 명령을 모두 시도했지만 지금까지 작동하지 못했습니다. 다음 코드는 명령 창을 여는 것처럼 보이지만 모델을 실행하지 않습니다.

# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")

이 문제를 어떻게 해결할 수 있습니까?


답변:


45

그 공백은 정말 귀찮을 수 있습니다 :-(. , 메서드 또는 기타에 os.chdir('C:/Documents\ and\ Settings/')대한 상대 경로를 따라 시도하십시오 ...os.systemsubprocess

최선의 노력이 경로의 공백 장애물을 우회하려는 시도가 계속 실패하면 다음 최선의 제안은 중요한 경로에 공백 을 피하는 것 입니다. 공백없는 디렉토리를 만들고 .exe거기에 중요한 파일을 복사 한 다음 시도해 볼 없습니까? 그 파괴적인 공간은 당신의 웰빙에 절대적으로 필수적인 것입니까 ...?


1
알렉스, 고마워. 이것도 작동했습니다. 괜찮으 시다면 질문이 하나 더 있습니다. 내 실행 파일이 내 입력 파일의 이름을 묻는다면 어떨까요? stdin을 사용하여 시도했지만 지금까지 성공하지 못했습니까?
Mesut

2
@mesut, 파일 이름을 "요청"하기 위해 사용하는 실행 파일은 무엇입니까? 예를 들어 자체 표준 입력 인 경우 subprocess.Popen원하는 값을 파이프하는 데 사용할 수 있습니다 . 더 깊이 들어가면 ( "콘솔"입력 사용) wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect를 시도 하십시오 .
Alex Martelli

입력 파일은 동일한 폴더에있는 기본 .txt 파일입니다. 이제 코드는 cmd 창에서 exe를 엽니 다. 그리고 실행 파일은 입력 파일의 이름을 묻습니다. 코드 내에서이 이름 (어쩌면 경로)을 정의 할 수있는 방법이 있습니까? subprocess.popen을 시도하고 변수를 살펴 보았습니다. 나는 stdin을 사용할 수 있다고 생각했지만 실제로는 작동하지 않았습니다. 당신은 C에있는 실행 파일 subprocess.popen으로 나에게 샘플을 제공 할 수 있다면 정말 감사하겠습니다 : \ flow_model, sac_bsl.txt과 같은 폴더에있는 입력 파일의 flow.exe 및 이름과 실행 파일의 이름을
Mesut nov.

"입력 파일 이름 요청"부분은 번거로운 부분입니다. 이미 언급했듯이 exe가 어떻게 코딩되는지 알지 못하는 것은 wexpectcmd 창에서 호출 될 때 해당 exe 파일이 표시되는 것을 정확히 시뮬레이션 할 수 있도록 해주므로 가장 가능성이 높은 솔루션입니다.
Alex Martelli

42

Python 2.7 이상 (특히 Python 3.5 이전)을 사용하는 경우 다음을 사용할 수 있습니다.

import subprocess
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) args로 설명 된 명령을 실행합니다. 명령이 완료 될 때까지 기다린 다음 returncode 속성을 반환합니다.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 인수를 사용하여 명령을 실행합니다. 명령이 완료 될 때까지 기다립니다. 반환 코드가 0이면 반환하고, 그렇지 않으면 CalledProcessError를 발생시킵니다. CalledProcessError 객체는 returncode 속성에 반환 코드를 갖습니다.

예: subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])

일반 Python 문자열에서 \ U 문자 조합은 확장 된 유니 코드 코드 포인트 이스케이프를 나타냅니다.

다음은 문서 링크입니다. http://docs.python.org/3.2/library/subprocess.html

Python 3.5 이상에서는 이제 많은 경우에 run ()을 사용할 수 있습니다. https://docs.python.org/3.5/library/subprocess.html#subprocess.run


7
Python 3.6.3은 run ()을
Ricardo Zorio 2017

33

가장 간단한 방법은 다음과 같습니다.

import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")

효과가있다; 나는 그것을 시도했다.


1
제대로 작동하지만 -start 등과 같은 매개 변수를 추가하는 방법이 있습니까?
Bassem Shahin

1
작동하지 않음 : module 'os' has no attribute 'startfile'. (python3.6 사용)
not2qubit

문서가 제공 하는 인상과 달리 Windows와 관련된 어떤 것도 작동하지 않는 것 같습니다 .
not2qubit 2018

24

내가 당신이라면 경로 앞에 'r'을 삽입하여 원시 문자열임을 나타내려고합니다. 그러면 슬래시를 사용할 필요가 없습니다. 예를 들면 :

os.system(r"C:\Documents and Settings\flow_model\flow.exe")

19

귀하의 사용법이 정확합니다. 외부 프로그램 인 flow.exe는 거기에 저장된 일부 외부 파일에 액세스하기 때문에 해당 디렉터리에서 실행되어야합니다.

따라서 시도해 볼 수 있습니다.

import sys, string, os, arcgisscripting
os.chdir('c:\\documents and settings\\flow_model')
os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')

(작은 따옴표 안에있는 큰 따옴표에주의하십시오 ...)


완벽하게 작동합니다. 어떻게 결과를 데이터 프레임에 직접 저장합니까?
Sade

11

subprocess를 사용 하면 더 작은 모듈이므로 .exe더 빨리 실행됩니다 .

import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])

1
당신은 의미 시작.exe 빨리?
Peter Mortensen


4

시험

import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])

그것을 시도했고 같은 일이 일어났습니다. cmd 창을 여는 것처럼 보이지만 실행 파일을 실행하지 않습니다. 실행 파일을 별도로 시도했는데 제대로 작동합니다. 또한 폴더를 C : / flow_model로 이동했습니다. 차이를 만들지 않았다. ??
Mesut

2

저라면 루트 디렉토리 (C :)에 EXE 파일을 넣고 그렇게 작동하는지 확인했습니다. 그렇다면 아마도 디렉토리 이름의 (이미 언급 한) 공백 일 것입니다. 그렇지 않은 경우 일부 환경 변수 일 수 있습니다.

또한 stderr을 확인하십시오 (int3의 이전 답변 사용).

import subprocess
process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \
                           stderr = subprocess.PIPE)
if process.stderr:
    print process.stderr.readlines()

일반적으로 Popen이나 Windows를 사용하지 않기 때문에 코드가 완전히 정확하지 않을 수 있지만 아이디어를 제공해야합니다. 오류 메시지가 오류 스트림에있을 수 있습니다.


2
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")

1
귀하의 코드가이 질문을 해결하는 이유에 대한 설명을 추가하십시오.
rje

이 게시물은 기본적으로 Windows * .bat 파일을 사용하는 것처럼 실행되는 * .exe 파일을 처리합니다.
SamAct

2

파이썬 2.6에서는 따옴표 "와 아포스트로피"로 묶인 문자열을 사용합니다. 또한 단일 /를 이중 //로 변경합니다. 작업 예제는 다음과 같습니다.

import os
os.system("'C://Documents and Settings//flow_model//flow.exe'") 

또한 프로그램이 수집하는 경우 모든 매개 변수를 사용할 수 있습니다.

os.system('C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot -e "plot [-10:10] sin(x),atan(x),cos(atan(x)); pause mouse"')

마지막으로 파이썬에서 직접 gnuplot을 사용하여 플로팅하는 경우와 같이 문자열 변수를 사용할 수 있습니다.

this_program='C://"Program Files (x86)"//Maxima-gcl-5.37.3//gnuplot//bin//gnuplot'

this_par='-e "set polar; plot [-2*pi:2*pi] [-3:3] [-3:3] t*sin(t); pause -1"'
os.system(this_program+" "+this_par)

1

C:\Documents인수 로 실행하려고 "and", "Settings/flow_model/flow.exe"합니까?

또한 subprocess.call().


0

올바른 사용법이지만 경로 이름의 공백이 어떤 이유로 인해 일을 엉망으로 만들 수 있습니다.

cmd.exe에서도 프로그램을 실행하여 오류를 나타낼 수있는 flow.exe의 출력을 볼 수 있습니다.


0

다양한 솔루션이 있으며 결과는 다음에 따라 크게 달라집니다.

  • 사용중인 OS : Windows, Cygwin, Linux, MacOS
  • 사용중인 Python 버전 : Python2 또는 Python3x

Windows에서만 작동한다고 주장되는 몇 가지 사항을 발견했지만 Windows 경로를 처리하는 OS 방식을 능가하는 Cygwin을 사용했기 때문일 수 있습니다. 다른 것들은 순수한 * nix 기반 OS 또는 Python2 또는 3에서만 작동합니다.

내 결과는 다음과 같습니다.

  • 일반적으로 os.system()가장 관용적 인 방법입니다.
  • os.startfile()가장 용서하지 않습니다. (운이 좋으면 Windows 전용 &&)
  • subprocess.Popen([...]) 권장 하지 않음
  • subprocess.run(winView, shell=True) 추천하는 방법!
  • subprocess무엇이든 사용 하면 보안 위험이 발생할 수 있음을 기억하십시오 .

다음을 시도하십시오.

import os, subprocess
...
winView = '/cygdrive/c/Windows/explorer.exe %s' % somefile
...
# chose one of these:
os.system(winView)
subprocess.Popen(['/cygdrive/c/Windows/explorer.exe', 'somefile.png'])
subprocess.run(winView, shell=True)

Q : 왜 사용하고 싶습니까? explorer Windows 입니까?

A : 새 파일의 결과 만보고 싶다면 탐색기가 해당 파일 형식에 대해 설정 한 기본 Windows 프로그램으로 파일을 자동으로 엽니 다. 따라서 사용할 기본 프로그램을 다시 지정할 필요가 없습니다.


0

위의 질문에 대해이 솔루션이 작동합니다.

실행 파일이있는 경로를 변경하기 만하면됩니다.

import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system("C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\flowwork.exe")


'''import sys, string, os

os.chdir('C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\\bin64')

os.system(r"C:\\Downloads\\xpdf-tools-win-4.00\\xpdf-tools-win-4.00\bin64\\pdftopng.exe test1.pdf rootimage")'''

여기 test1.pdf rootimage는 내 코드입니다.


당신은 폐쇄 잊어 버리셨습니까 "에를 os.system?
Suraj Rao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.