riconosciuto Utilizzo del sottoprocesso per eseguire script Python su Windows




python script (6)

subprocess.Popen(cmd, ..., shell=True) funziona come un incantesimo. Su Windows viene riconosciuta l'estensione del file .py , quindi Python viene richiamato per elaborarlo (su * NIX solo il solito shebang). L'ambiente del percorso controlla se le cose sono viste. Quindi il primo Popen su Popen è solo il nome della sceneggiatura .

subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True)

C'è un modo semplice per eseguire uno script Python su Windows / Linux / OS X?

Negli ultimi due, subprocess.Popen("/the/script.py") funziona, ma su Windows ho il seguente errore:

Traceback (most recent call last):
  File "test_functional.py", line 91, in test_functional
    log = tvnamerifiy(tmp)
  File "test_functional.py", line 49, in tvnamerifiy
    stdout = PIPE
  File "C:\Python26\lib\subprocess.py", line 595, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
    startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application

monkut's commento monkut's : il caso d'uso non è chiaro. Perché usare il sottoprocesso per eseguire uno script Python? C'è qualcosa che ti impedisce di importare lo script e chiamare la funzione necessaria?

Stavo scrivendo uno script veloce per testare la funzionalità generale di uno strumento da riga di comando Python (per testarlo su varie piattaforme). Fondamentalmente ha dovuto creare un sacco di file in una cartella temporanea, eseguire lo script su questo e controllare che i file siano stati rinominati correttamente.

Avrei potuto importare lo script e chiamare la funzione, ma dal momento che si basa su sys.argv e utilizza sys.exit() , avrei dovuto fare qualcosa del tipo ..

import sys
import tvnamer
sys.argv.append("-b", "/the/folder")
try:
    tvnamer.main()
except BaseException, errormsg:
    print type(errormsg)

Inoltre, volevo catturare lo stdout e lo stderr per il debug in caso qualcosa fosse andato storto.

Ovviamente un modo migliore sarebbe quello di scrivere lo script in un modo più testabile, ma lo script è fondamentalmente "fatto" e sto facendo un batch finale di test prima di fare una versione "1.0" (dopo di che sto andando fare una riscrittura / ristrutturazione, che sarà molto più ordinata e più verificabile)

Fondamentalmente, era molto più semplice eseguire semplicemente lo script come processo, dopo aver trovato la variabile sys.executable . L'avrei scritto come script di shell, ma non sarebbe stato multipiattaforma. Lo script finale può essere trovato here


Cosa ne pensi di questo:

import sys
import subprocess

theproc = subprocess.Popen("myscript.py", shell = True)
theproc.communicate()                   # ^^^^^^^^^^^^

Questo dice al subprocess di usare la shell del sistema operativo per aprire il tuo script e funziona su qualsiasi cosa che puoi semplicemente eseguire in cmd.exe.

Inoltre, questo cercherà PATH per "myscript.py" - che potrebbe essere desiderabile.


Sembra che Windows cerchi di eseguire lo script usando il proprio framework EXE piuttosto che chiamarlo come

python /the/script.py

Provare,

subprocess.Popen(["python", "/the/script.py"])

Modifica: "python" dovrebbe essere sul tuo percorso.


Quando esegui uno script python su Windows nel sottoprocesso devi usare python davanti al nome dello script. Provare:

process = subprocess.Popen("python /the/script.py")

Stai usando un separatore di pathname che dipende dalla piattaforma. Windows usa "\" e Unix usa "/".


Appena trovato sys.executable - il percorso completo dell'eseguibile Python corrente, che può essere usato per eseguire lo script (invece di affidarsi allo shbang, che ovviamente non funziona su Windows)

import sys
import subprocess

theproc = subprocess.Popen([sys.executable, "myscript.py"])
theproc.communicate()




subprocess