Właśnie zacząłem pracować nad Pythonem i próbowałem uruchomić zewnętrzny plik wykonywalny z Pythona.
Mam plik wykonywalny programu napisanego w języku Fortran. Powiedzmy, że nazwa pliku wykonywalnego to flow.exe. Mój plik wykonywalny znajduje się w C:\Documents and Settings\flow_model
. Wypróbowałem zarówno komendy os.system, jak i popen, ale do tej pory nie mogłem sprawić, by działało. Poniższy kod wydaje się otwierać okno poleceń, ale nie powodowałby wykonania modelu.
# Import system modules
import sys, string, os, arcgisscripting
os.system("C:/Documents and Settings/flow_model/flow.exe")
Jak mogę to naprawić?
python
executable
Mesut
źródło
źródło
Odpowiedzi:
Te białe spacje mogą być naprawdę kłopotliwe :-(. Spróbuj
os.chdir('C:/Documents\ and\ Settings/')
podążać za ścieżkami względnymi dlaos.system
,subprocess
metod lub cokolwiek ...Jeśli najlepsze próby ominięcia przeszkód występujących w ścieżce wciąż kończą się niepowodzeniem, moja następna najlepsza sugestia to unikanie pustych miejsc na kluczowych ścieżkach. Nie mógłbyś stworzyć katalogu bez spacji, skopiować tam kluczowy
.exe
plik i spróbować tego ? Czy ta pustosząca spustoszenie przestrzeń jest absolutnie niezbędna dla Twojego dobrego samopoczucia ...?źródło
subprocess.Popen
do potokowania tam żądanych wartości. Jeśli idzie głębiej (używając wejścia "konsoli"), spróbuj wexpect, sage.math.washington.edu/home/goreckc/sage/wexpect .wexpect
jest najbardziej prawdopodobnym rozwiązaniem, ponieważ pozwala dokładnie zasymulować to, co zobaczyłby plik exe po wywołaniu w oknie cmd.Jeśli korzystasz z Pythona 2.7 lub nowszego (zwłaszcza przed Pythonem 3.5), możesz użyć następujących:
import subprocess
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Uruchamia polecenie opisane przez args. Czeka na zakończenie polecenia, a następnie zwraca atrybut powrotu.subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
Uruchamia polecenie z argumentami. Czeka na zakończenie polecenia. Jeśli kod powrotu był równy zero, to zwraca, w przeciwnym razie wywołuje CalledProcessError. Obiekt CalledProcessError będzie miał kod powrotu w atrybucie returncodePrzykład:
subprocess.check_call([r"C:\pathToYourProgram\yourProgram.exe", "your", "arguments", "comma", "separated"])
Oto link do dokumentacji: http://docs.python.org/3.2/library/subprocess.html
W przypadku Pythona 3.5+ możesz teraz używać run () w wielu przypadkach: https://docs.python.org/3.5/library/subprocess.html#subprocess.run
źródło
Najprostszy sposób to:
import os os.startfile("C:\Documents and Settings\flow_model\flow.exe")
To działa; Próbowałem tego.
źródło
module 'os' has no attribute 'startfile'
. (UżywającNa twoim miejscu spróbuję wstawić „r” przed twoją ścieżką, aby wskazać, że jest to nieprzetworzony ciąg - a wtedy nie będziesz musiał używać ukośników. Na przykład:
os.system(r"C:\Documents and Settings\flow_model\flow.exe")
źródło
Twoje użycie jest prawidłowe. Założę się, że twój zewnętrzny program flow.exe musi zostać uruchomiony w swoim katalogu, ponieważ ma dostęp do plików zewnętrznych, które są tam przechowywane.
Możesz więc spróbować:
import sys, string, os, arcgisscripting os.chdir('c:\\documents and settings\\flow_model') os.system('"C:\\Documents and Settings\\flow_model\\flow.exe"')
(Uważaj na podwójne cudzysłowy w pojedynczych cudzysłowach ...)
źródło
Użyj podprocesu , jest to mniejszy moduł, więc działa
.exe
szybciej.import subprocess subprocess.Popen([r"U:\Year 8\kerbal space program\KSP.exe"])
źródło
.exe
szybciej?Korzystając z os.system :
import os os.system(r'"C:/Documents and Settings/flow_model/flow.exe"')
źródło
Próbować
import subprocess subprocess.call(["C:/Documents and Settings/flow_model/flow.exe"])
źródło
Gdybym to był ja, umieściłbym plik EXE w katalogu głównym (C :) i sprawdziłbym, czy to działa. Jeśli tak, to prawdopodobnie (już wspomniane) spacje w nazwie katalogu. Jeśli nie, może to być kilka zmiennych środowiskowych.
Spróbuj również sprawdzić, czy stderr (używając wcześniejszej odpowiedzi przez int3):
import subprocess process = subprocess.Popen(["C:/Documents and Settings/flow_model/flow.exe"], \ stderr = subprocess.PIPE) if process.stderr: print process.stderr.readlines()
Kod może nie być całkowicie poprawny, ponieważ zwykle nie używam Popen ani Windows, ale powinienem dać pomysł. Może się zdarzyć, że komunikat o błędzie znajduje się w strumieniu błędów.
źródło
import os path = "C:/Documents and Settings/flow_model/" os.chdir(path) os.system("flow.exe")
źródło
w pythonie 2.6 użyj ciągu znaków w cudzysłowie "i apostrofów". Również zmiana pojedynczego / na podwójne //. Twój przykład roboczy będzie wyglądał następująco:
import os os.system("'C://Documents and Settings//flow_model//flow.exe'")
Możesz również użyć dowolnych parametrów, jeśli Twój program je pobiera.
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"')
na koniec możesz użyć zmiennej typu string, na przykład rysowanie za pomocą gnuplot bezpośrednio z Pythona:
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)
źródło
Czy to jest próba wykonania
C:\Documents
z argumentami"and", "Settings/flow_model/flow.exe"
?Możesz także rozważyć
subprocess.call()
.źródło
To prawidłowe użycie, ale być może spacje w nazwie ścieżki z jakiegoś powodu psują.
Możesz również chcieć uruchomić program pod cmd.exe, aby zobaczyć wszelkie dane wyjściowe z pliku flow.exe, które mogą wskazywać na błąd.
źródło
Istnieje wiele różnych rozwiązań, a wyniki będą w dużym stopniu zależały od:
Ponieważ odkryłem, że niektóre rzeczy, o których twierdzi się, że działają tylko w systemie Windows, nie działają, prawdopodobnie dlatego, że używam Cygwin, który przechytrza sposób systemu operacyjnego, aby radzić sobie ze ścieżkami systemu Windows. Inne rzeczy działają tylko w systemach operacyjnych opartych na czystym * nix lub w Python2 lub 3.
Oto moje ustalenia:
os.system()
jest to najbardziej wybaczająca metoda.os.startfile()
jest najmniej wyrozumiały. (Tylko Windows &&, jeśli masz szczęście)subprocess.Popen([...])
nie zalecanesubprocess.run(winView, shell=True)
zalecany sposób!subprocess
do czegokolwiek może stanowić zagrożenie dla bezpieczeństwa .Spróbuj tych:
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)
P: Dlaczego chcesz używać
explorer
w systemie Windows?Odp .: Ponieważ jeśli chcesz tylko spojrzeć na wyniki jakiegoś nowego pliku, eksplorator automatycznie otworzy plik za pomocą dowolnego domyślnego programu Windows, który ustawiłeś dla tego typu pliku. Nie ma więc potrzeby ponownego określania domyślnego programu do użycia.
źródło
na powyższe pytanie to rozwiązanie działa.
po prostu zmień ścieżkę do miejsca, w którym znajduje się plik wykonywalny.
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")'''
Tutaj obraz główny test1.pdf jest dla mojego kodu.
źródło
"
wos.system
?