riconosciuto - python script




Utilizzo del sottoprocesso per eseguire script Python su Windows (5)

Ad esempio, per eseguire seguito con prompt dei comandi o file BATCH possiamo usare questo:

C:\Python27\python.exe "C:\Program files(x86)\dev_appserver.py" --host 0.0.0.0 --post 8080 "C:\blabla\"

Lo stesso per quanto riguarda Python, possiamo farlo:

subprocess.Popen(['C:/Python27/python.exe', 'C:\\Program files(x86)\\dev_appserver.py', '--host', '0.0.0.0', '--port', '8080', 'C:\\blabla'], shell=True)

o

subprocess.Popen(['C:/Python27/python.exe', 'C:/Program files(x86)/dev_appserver.py', '--host', '0.0.0.0', '--port', '8080', 'C:/blabla'], 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


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()

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

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)

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





subprocess