2009-11-28 40 views
53

Ho appena iniziato a lavorare su python e ho cercato di eseguire un file eseguibile esterno python. Ho un eseguibile per un programma scritto in Fortran. Diciamo che il nome dell'eseguibile è flow.exe. E il mio eseguibile si trova in C: \ Documents and Settings \ flow_model Ho provato entrambi i comandi os.system e popen ma finora non riuscivo a farlo funzionare. Il seguente codice sembra aprire la finestra di comando ma non eseguirà il modello.esegue un programma esterno (eseguibile) in python?

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

Qualche suggerimento là fuori? Qualsiasi aiuto sarebbe molto apprezzato.

+1

Possibile duplicato di [Chiamata di un comando esterno in Python] (https://stackoverflow.com/questions/89228/calling-an-external-command-in -python) – mkobit

risposta

25

Quegli spazi bianchi può davvero essere un fastidio :-(. Prova os.chdir('C:/Documents\ and\ Settings/') seguito da percorsi relativi per os.system, subprocess metodi, o qualsiasi altra cosa ...

Se best-effort tenta di bypassare l'ostacolo spazi bianchi-in-path continua a non riuscire, quindi il mio migliore suggerimento è evitare con spazi vuoti nei percorsi cruciali. Impossibile creare una directory senza spazi vuoti, copiare il file .exe fondamentale e provare quello? Sono quelli che distruggono lo spazio assolutamente essenziale per il tuo benessere ...?

+0

Alex, grazie. Anche questo ha funzionato. Ho un'altra domanda se non ti dispiace. E se il mio eseguibile chiedesse il nome del mio file di input? Ho provato a farlo usando lo stdin ma non ci sono riuscito finora? – Mesut

+1

@mesut, qual è quell'eseguibile che usa "chiedere" il nome del file? Se è il suo input standard, per esempio, potresti essere in grado di usare 'subprocess.Popen' per convogliare i valori desiderati lì. Se va più in profondità (usando l'input "console"), prova wexpect, http://sage.math.washington.edu/home/goreckc/sage/wexpect/. –

+0

il file di input è un file .txt di base nella stessa cartella. Il codice ora apre l'exe dalla finestra di cmd. E l'eseguibile richiede il nome del file di input. C'è un modo per definire questo nome (forse come percorso) all'interno del codice? Ho provato subprocess.popen e ho provato a cercare nelle variabili. Pensavo di poter usare lo stdin ma non funzionava davvero. Sarei davvero grato se potessi darmi un campione con subprocess.popen con l'eseguibile che si trova in C: \ flow_model, il nome dell'eseguibile come flow.exe e il nome del file di input che si trova nella stessa cartella di sac_bsl.txt – Mesut

1

Provare ad eseguire C:\Documents con argomenti di "and", "Settings/flow_model/flow.exe"?

Inoltre, si potrebbe prendere in considerazione subprocess.call()

2

Prova

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

provato e la stessa cosa è accaduta. sembra che apra la finestra di cmd ma non eseguirà l'eseguibile. Ho provato l'eseguibile separatamente e funziona bene. Ho anche spostato la cartella come C:/flow_model. Non ha fatto la differenza. ?? – Mesut

0

Questo è l'uso corretto, ma forse gli spazi nel nome del percorso vengono a confondere le cose per qualche motivo.

Si consiglia di eseguire il programma anche in cmd.exe in modo da poter visualizzare qualsiasi output da flow.exe che potrebbe indicare un errore.

14

mi piacerebbe provare l'inserimento di un 'r' di fronte al vostro percorso se fossi in te, per indicare che la sua una corda grezza - e quindi non sarà necessario utilizzare le barre, per esempio:

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

il tuo utilizzo è corretto, scommetto che il tuo programma esterno, flow.exe, deve essere eseguito nella sua directory perché accede ad alcuni file esterni memorizzati lì.

così si potrebbe provare:

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

(guardatevi le virgolette all'interno delle singole citazioni ...)

+1

Adrien, Grazie, ha funzionato. – Mesut

1

Se si trattasse di me, avevo messo il file EXE nella diretcory radice (C :) e vedi se funziona così. Se è così, probabilmente sono gli spazi (già citati) nel nome della directory. In caso contrario, potrebbero essere alcune variabili di ambiente.

Inoltre, prova a controllare voi STDERR (utilizzando una risposta prima da INT3):

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

Il codice non potrebbe essere del tutto corretto come faccio di solito non uso Popen o Windows, ma dovrebbe dare l'idea . Potrebbe essere che il messaggio di errore si trovi sul flusso di errori.

13

Il modo più semplice è:

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

Funziona, l'ho provato.

32

Se Usare Python 2.7 o superiore (in particolare prima di Python 3.5) è possibile utilizzare il seguente:

import subprocess 
  • subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Esegue il comando descritto da args. Attende il completamento del comando, quindi restituisce l'attributo returncode.
  • subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Esegue il comando con argomenti. Attende il completamento del comando. Se il codice di ritorno era zero, restituisce, altrimenti solleva CalledProcessError. L'oggetto CalledProcessError avrà il codice di ritorno nel returncode attributo

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

In stringhe pitone regolari, la combinazione di caratteri \ U segnala un esteso Unicode codepoint fuga.

ecco il link alla documentazione: http://docs.python.org/3.2/library/subprocess.html

Per Python 3.5+ è ora possibile utilizzare run() in molti casi: https://docs.python.org/3.5/library/subprocess.html#subprocess.run

+2

Python 3.6.3 raccomanda [run()] (https://docs.python.org/3.6/library/subprocess.html#subprocess.run) –

6

Usa sottoprocesso, è un modulo più piccolo in modo gestisce il .exe più veloce.

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

Utilizzando os.system:

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

Grazie mille il suo funzionamento –

Problemi correlati