programing

파이썬에서 외부 프로그램(실행 파일)을 실행하시겠습니까?

sourcetip 2023. 7. 31. 22:17
반응형

파이썬에서 외부 프로그램(실행 파일)을 실행하시겠습니까?

저는 방금 파이썬에서 일을 시작했고, 파이썬에서 외부 실행 파일을 실행하려고 노력해 왔습니다.

포트란으로 작성된 프로그램의 실행 파일이 있습니다.실행 파일의 이름이 flow.exe라고 가정합니다. 제 은 그고내실파은에 .C:\Documents and Settings\flow_modelos.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

반응형