developer tip

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

copycodes 2020. 9. 24. 07:57
반응형

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


방금 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")

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


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

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


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


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

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"')

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


subprocess를 사용 하면 더 작은 모듈이므로 .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"])

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

또한 subprocess.call().


저라면 루트 디렉토리 (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를 사용하지 않기 때문에 코드가 완전히 정확하지 않을 수 있지만 아이디어를 제공해야합니다. 오류 메시지가 오류 스트림에있을 수 있습니다.


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

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

You may want to run the program under cmd.exe as well so you can see any output from flow.exe that might be indicating an error.


for the above question this solution works.

just change the path to where your executable file is located.

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\\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")'''

Here test1.pdf rootimage is for my code .


There are loads of different solutions, and the results will strongly depend on:

  • the OS you are using: Windows, Cygwin, Linux, MacOS
  • the python version you are using: Python2 or Python3x

As I have discovered some things that are claimed to work only in Windows, doesn't, probably because I happen to use Cygwin which is outsmarting the OS way to deal with Windows paths. Other things only work in pure *nix based OS's or in Python2 or 3.

Here are my findings:

  • Generally speaking, os.system() is the most forgiving method.
  • os.startfile() is the least forgiving. (Windows only && if you're lucky)
  • subprocess.Popen([...]) not recommended
  • subprocess.run(winView, shell=True) the recommended way!
  • Remembering that using subprocess for anything may pose a security risk.

Try these:

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: Why would you want to use explorer in Windows?

A: Because if you just want to look at the results of some new file, explorer will automatically open the file with whatever default windows program you have set for that file type. So no need to re-specify the default program to use.


in python 2.6 use string enclosed inside quotation " and apostrophe ' marks. Also a change single / to double //. Your working example will look like this:

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

Also You can use any parameters if Your program ingest them.

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"')

finally You can use string variable, as an example is plotting using gnuplot directly from python:

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)

참고URL : https://stackoverflow.com/questions/1811691/running-an-outside-program-executable-in-python

반응형