41 votos

Uso de subproceso para ejecutar script de Python en Windows

Hay una forma sencilla para ejecutar una secuencia de comandos de Python en Windows/Linux/mac OS X?

En los dos últimos, subprocess.Popen("/the/script.py") obras, pero en Windows me sale el siguiente error:

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 del comentario: El caso de uso no está claro. ¿Por qué utilizar subproceso para ejecutar una secuencia de comandos de python? ¿Hay algo que le impide la importación de la secuencia de comandos y llamar a la función necesaria?

Yo estaba escribiendo una rápida secuencia de comandos para probar la funcionalidad general de Python-herramienta de línea de comandos (a prueba en varias plataformas). Básicamente se tuvo que crear un montón de archivos en una carpeta temporal, ejecute la secuencia de comandos de esta y de verificación de los archivos que se han cambiado de nombre correctamente.

Yo podría haber importado el guión y la llamada a la función, pero ya que se basa en sys.argv y los usos sys.exit(), yo tendría que hacer algo como..

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

También, quería capturar el stdout y stderr para la depuración en caso de que algo vaya mal.

Por supuesto, una mejor manera sería escribir la secuencia de comandos en la unidad más-comprobables, pero el guión es básicamente "hecho" y estoy haciendo un último lote de prueba antes de hacer un "1.0" liberación (después de que me voy a hacer una reescritura/reestructuración, que será mucho más ordenado y más fácil de probar)

Básicamente, era mucho más fácil simplemente ejecutar la secuencia de comandos como un proceso, después de encontrar el sys.executable variable. Yo lo habría escrito como un shell-script, pero que no han sido de la multiplataforma. El final de la secuencia de comandos se puede encontrar aquí

63voto

dbr Puntos 66401

Acabo de encontrar sys.executable -ruta de acceso completa el actual Python ejecutable, que se puede utilizar para ejecutar el script (en lugar de la shbang, que obviamente no funciona en Windows)

import sys
import subprocess

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

24voto

romkyns Puntos 17295

Qué tal esto:

import sys
import subprocess

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

Esto dice subprocess usar el shell del sistema operativo para abrir su script y funciona en cualquier cosa que usted puede ejecutar sólo en cmd.exe.

Además, esto va a buscar el camino para "myscript.py" - que podría ser deseable.

7voto

hmc Puntos 21

Si subprocess.Popen(cmd, ..., shell=True) funciona como un encanto. En Windows el .py extensión de archivo se reconoce, así que Python se invoca para procesarlo (en * NIX sólo el asunto generalmente). El entorno de ruta de acceso controla si las cosas se ven. Así que el primer arg a Popen es sólo el nombre del script.

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

5voto

viksit Puntos 1837

Parece que windows intenta ejecutar el script utilizando su propio marco EXE en lugar de llamarlo como

python /the/script.py

Intento,

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

Edición: "python" tendría que ser en su camino.

1voto

Robbie Puntos 392

Cuando se ejecuta un python script en windows en subproceso le debe utilizar python delante del nombre del script. Tratar de:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X