Domanda

Ho appena iniziato a lavorare su Python e ho cercato di eseguire un eseguibile esterno da 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 sono riuscito a farlo funzionare. Il codice seguente sembra aprire la finestra di comando, ma non eseguirà il modello.

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

Come posso risolvere questo problema?

È stato utile?

Soluzione

Questi spazi bianchi possono davvero dare fastidio :-(. Prova os.chdir ('C: / Documents \ and \ Settings /') seguito da percorsi relativi per os.system , metodi sottoprocesso o qualunque altro ...

Se i tentativi migliori di aggirare l'ostacolo degli spazi bianchi continuano a fallire, il mio prossimo suggerimento migliore è quello di evitare di avere spazi vuoti nei percorsi cruciali. Non potresti creare una directory senza spazi vuoti, copiare il file .exe cruciale e provare quello ? Quegli spazi devastanti sono assolutamente essenziali per il tuo benessere ...?

Altri suggerimenti

Se si utilizza Python 2.7 o versioni successive (soprattutto prima di Python 3.5) è possibile utilizzare quanto segue:

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 genera CalledProcessError. L'oggetto CalledProcessError avrà il codice di ritorno nell'attributo returncode

Esempio: subprocess.check_call ([r " C: \ pathToYourProgram \ yourProgram.exe " ;, " your " ;, " argomenti " ;, " comma " ;, " separati "])

  

Nelle normali stringhe Python, la combinazione di caratteri \ U segnala a   escape del punto di codice Unicode esteso.

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

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

Proverei a inserire una 'r' davanti al tuo percorso se fossi in te, per indicare che si tratta di una stringa non elaborata - e quindi non dovrai usare le barre. Ad esempio:

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

Il modo più semplice è:

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

Funziona; L'ho provato.

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ì.

Quindi potresti provare:

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

(Attenzione alle doppie virgolette all'interno delle virgolette singole ...)

Usa sottoprocesso , è un modulo più piccolo, quindi esegue .exe più velocemente.

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

Utilizzando os.system :

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

Prova

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

Sta tentando di eseguire C: \ Documents con argomenti " e " ;, " Settings / flow_model / flow.exe " ?

?

Inoltre, potresti considerare subprocess.call () .

Se fossi in me, metterei il file EXE nella directory principale (C :) e vedrei se funziona così. In tal caso, probabilmente sono gli spazi (già menzionati) nel nome della directory. In caso contrario, potrebbero essere alcune variabili di ambiente.

Inoltre, prova a controllarti stderr (usando una risposta precedente di 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 potrebbe non essere del tutto corretto in quanto di solito non uso Popen o Windows, ma dovrei dare l'idea. È possibile che il messaggio di errore si trovi sul flusso di errori.

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

Potresti voler eseguire anche il programma in cmd.exe in modo da poter vedere qualsiasi output da flow.exe che potrebbe indicare un errore.

per la domanda precedente questa soluzione funziona.

basta cambiare il percorso in cui si trova il file eseguibile.

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

Qui test1.pdf rootimage è per il mio codice.

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

Esistono molte soluzioni diverse e i risultati dipenderanno fortemente da:

  • il sistema operativo in uso: Windows, Cygwin, Linux, MacOS
  • la versione di Python in uso: Python2 o Python3x

Come ho scoperto alcune cose che si dice funzionino solo in Windows, probabilmente no, perché mi capita di usare Cygwin che sta superando il modo in cui il sistema operativo gestisce i percorsi di Windows. Altre cose funzionano solo su SO basati su * nix o in Python2 o 3.

Ecco i miei risultati:

  • In generale, os.system () è il metodo più tollerante.
  • os.startfile () è il meno tollerante. (Solo Windows & amp; & amp; se sei fortunato)
  • subprocess.Popen ([...]) non raccomandato
  • subprocess.run (winView, shell = True) nel modo consigliato!
  • Ricordando che l'utilizzo di sottoprocesso per qualsiasi cosa può costituire un rischio per la sicurezza .

Prova questi:

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)

D: Perché dovresti utilizzare explorer in Windows?

A: Perché se vuoi solo guardare i risultati di un nuovo file, explorer aprirà automaticamente il file con qualunque programma Windows predefinito tu abbia impostato per quel tipo di file. Quindi non è necessario specificare nuovamente il programma predefinito da utilizzare.

in python 2.6 usa una stringa racchiusa tra virgolette " e segni di apostrofo. Anche un cambio da singolo / a doppio //. Il tuo esempio di lavoro sarà simile al seguente:

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

Inoltre puoi usare qualsiasi parametro se il tuo programma li ingerisce.

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

Finalmente puoi usare la variabile stringa, come esempio sta tramando usando gnuplot direttamente da 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top