파이썬에서 외부 프로그램(실행 파일)을 실행하시겠습니까?
저는 방금 파이썬에서 일을 시작했고, 파이썬에서 외부 실행 파일을 실행하려고 노력해 왔습니다.
포트란으로 작성된 프로그램의 실행 파일이 있습니다.실행 파일의 이름이 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")
이걸 어떻게 고칠 수 있을까요?
Python 2.7 이상(특히 Python 3.5 이전 버전)을 사용하는 경우 다음을 사용할 수 있습니다.
import subprocess
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
인수로 설명된 명령을 실행합니다.명령이 완료될 때까지 기다린 다음 반환 코드 특성을 반환합니다.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
인수를 사용하여 명령을 실행합니다.명령이 완료될 때까지 기다립니다.반환 코드가 0이면 반환되고 그렇지 않으면 호출된 프로세스 오류가 발생합니다. 코드 특성 CalledProcessError의 .
예: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
그 하얀 공간들은 정말 번거로울 수 있습니다.os.chdir('C:/Documents\ and\ Settings/')
다음에 대한 상대 경로가 표시됩니다.os.system
,subprocess
방법이든 뭐든...
경로 내 공백 장애물을 우회하려는 최선의 노력이 계속 실패한다면, 저의 다음 최선의 제안은 중요한 경로에 공백이 생기는 것을 피하는 것입니다.빈칸이 없는 디렉터리를 만들 수 없습니까? 중요한 디렉터리를 복사하십시오..exe
거기에 줄을 치고, 그것을 해보시겠습니까?그 파괴적인 공간이 당신의 행복에 절대적으로 필수적인가요?
가장 간단한 방법은 다음과 같습니다.
import os
os.startfile("C:\Documents and Settings\flow_model\flow.exe")
효과가 있습니다. 시도해 봤습니다.
저라면 경로 앞에 'r'을 삽입하여 원시 문자열임을 나타내려고 합니다. 그러면 슬래시를 사용할 필요가 없습니다.예:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
사용법이 정확합니다.외부 프로그램인 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"')
(싱글 따옴표 안에 있는 큰따옴표를 주의하십시오...)
하위 프로세스를 사용합니다. 모듈이 더 작으므로 모듈을 실행합니다..exe
더빠르게.
import subprocess
subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
os.system 사용:
import os
os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
해라
import subprocess
subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
저라면 EXE 파일을 루트 디렉터리(C:)에 넣고 그렇게 작동하는지 확인할 것입니다.그렇다면 디렉토리 이름에 있는 (이미 언급된) 공백일 수 있습니다.그렇지 않으면 일부 환경 변수일 수 있습니다.
또한 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를 사용하지 않기 때문에 코드가 완전히 정확하지 않을 수 있지만, 아이디어를 제공해야 합니다.오류 메시지가 오류 스트림에 있을 수 있습니다.
import os
path = "C:/Documents and Settings/flow_model/"
os.chdir(path)
os.system("flow.exe")
바롭에 의해 추가된 노트
이게 왜 먹히냐고 댓글을 달아주셨어요.이유는 이렇습니다.
OP의 문제는 os.system("...")이 경로에 공백이 있을 때 제대로 작동하지 않는다는 것입니다. (참고: OS.system은 '"..."") 하지만 어쨌든)
OP가 cmd 프롬프트에서 그들의 프로그램을 시도했다면 그들은 오류를 분명히 보았을 것입니다.
C:\carp>type blah.py수입품os.system(R"C:\Program Files(x86)\Google\Chrome\Application\chrome.exe") C:\carp>피톤 blah.py'C:\Program'은 내부 또는 외부 명령으로 인식되지 않습니다.작동 가능한 프로그램 또는 배치 파일. C:\carp>
따라서 os.system("calc.exe")(calc.exe가 경로 환경 변수에 있음)에 대해서는 문제가 없습니다.또는 os.system(R"c:\windows\system32\calc.exe")의 경우.그 길에는 공간이 없습니다.
C:\>md "aa bb cc"
C:\>copy c:\windows\system32\calc.exe "c:\aa bb cc\cccalc.exe"
1 file(s) copied.
이것은 작동합니다(지정된 파일 "c:\aa bb cc\cccalc.exe").
import os
os.chdir(R"c:\aa bb cc")
os.system("cccalc.exe")
다른 옵션은 subprocess.run 및 subprocess.open입니다.
python 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"')
마지막으로 문자열 변수를 사용할 수 있습니다. 예를 들어 python에서 직접 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)
그들이 그들을 죽인 것을C:\Documents
"and", "Settings/flow_model/flow.exe"
?
또한, 당신은 고려할 수 있습니다.subprocess.call()
.
다양한 솔루션이 있으며, 그 결과는 다음과 같이 크게 좌우됩니다.
- 사용 중인 OS:Windows, Cygwin, 리눅스, MacOS
- 사용 중인 파이썬 버전:Python2 또는 Python3x
Windows에서만 작동한다고 주장되는 일부 사항을 발견했기 때문에 그렇지 않습니다. 아마도 Cygwin을 사용하기 때문에 Windows 경로를 처리하는 데 OS 방식을 능가합니다.다른 것들은 순수한 *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: Windows에서 사용하려는 이유는 무엇입니까?
A: 새 파일의 결과만 보려면 해당 파일 형식에 대해 설정한 기본 창 프로그램이 있는 파일을 탐색기에서 자동으로 열기 때문입니다.따라서 사용할 기본 프로그램을 다시 지정할 필요가 없습니다.
올바른 사용법이지만 경로 이름에 공백이 있으면 어떤 이유에서인지 상황이 엉망이 될 수 있습니다.
오류를 나타낼 수 있는 flow.exe의 출력을 확인할 수 있도록 cmd.exe에서 프로그램을 실행하는 것도 좋습니다.
위의 질문에 대해 이 솔루션은 작동합니다.
실행 파일이 있는 경로를 변경하기만 하면 됩니다.
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 루트 이미지는 내 코드에 대한 것입니다.
언급URL : https://stackoverflow.com/questions/1811691/running-an-outside-program-executable-in-python
'programing' 카테고리의 다른 글
Oracle: 구분 기호와 일치하지만 두 피연산자가 모두 NULL이 아닌 경우에만 해당 (0) | 2023.07.31 |
---|---|
툴체인과 크로스 컴파일러는 무엇입니까? (0) | 2023.07.31 |
IQueryable 결과 집합이 null인지 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2023.07.31 |
자바스크립트에서 x,y 좌표를 사용하여 클릭을 시뮬레이션하는 방법은 무엇입니까? (0) | 2023.07.31 |
CSS - Overflow: Scroll; - 항상 수직 스크롤 막대를 표시합니까? (0) | 2023.07.31 |