Pregunta

Si salvo mis archivos de código como .pyw, no aparece la ventana de la consola - que es lo que quiero - pero si el código incluye una llamada a os.system, sigo teniendo una ventana de consola molestos. Asumo que es causado por la llamada a os.system. ¿Hay una manera de ejecutar otros archivos desde dentro de mi guión .pyw sin levantar la ventana de consola en absoluto?

¿Fue útil?

Solución

Se podría tratar de usar la subproceso módulo (subprocess.Popen, subprocess.call o lo que sea) con shell=True el argumento de que si quieres evitar el inicio de una ventana de la consola.

Otros consejos

Debe utilizar subprocess.Popen cruce de clase como ejemplo el valor del parámetro de startupinfo subprocess.STARTUPINFO clase con atributo dwFlags sosteniendo bandera subprocess.STARTF_USESHOWWINDOW y atributo wShowWindow sosteniendo subprocess.SW_HIDE bandera. Esto se puede inferir de la lectura de las líneas 866-868 de código fuente subprocess.py. Puede ser que sea necesario pasar también subprocess.CREATE_NEW_CONSOLE marcar como un valor de creationflags parámetro ya que se corre bajo pythonw.exe que no se abre una consola.

Cuando se utiliza shell=True simplemente sucede que todo lo anterior se ha ajustado correctamente, pero eso no quiere decir que sea una solución adecuada. Yo diría que no es debido a que implica una sobrecarga de ejecutar el intérprete de comandos y analizar argumentos. Además se debe tener en cuenta que (...) el uso de la cáscara = verdad es desaconseja encarecidamente en los casos en que la cadena de comandos se construye a partir de la entrada externa de acuerdo a la documentación de módulo subproceso.

La solución que Piotr describe en realidad no es tan complicado como puede parecer. Aquí hay un ejemplo donde un startupinfo se pasa a una invocación check_call para suprimir la ventana de consola:

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW

subprocess.check_call(cmd, startupinfo=startupinfo)

Desde la funciones de confort call, check_call y check_output adelante su **kwargs al constructor Popen, no es necesario utilizar Popen directamente.

Las personas son un poco perezoso ... lo haría THX @Piotr Dobrogost y @Frank S. Thomas para sus respuestas.

Vine con el código que está runinng en Linux y Windows:

import platform
import subprocess
startupinfo = None
if platform.system() == 'Windows':
    import _subprocess  # @bug with python 2.7 ?
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
    startupinfo.wShowWindow = _subprocess.SW_HIDE

Más tarde ...

args = [exe, ...]
out = subprocess.check_output(args, startupinfo=startupinfo)

chicos Thx;)

Además: acaba de tener en cuenta que el siguiente código usando 'llamada' también funciona en Python 2.7 (en Windows) con el código 'STARTUPINFO' arriba:

def run_command(cmd, sin, sout):
    print "Running cmd : %s"%(" ".join(cmd) )
    return subprocess.call( cmd, stdin=sin, stdout=sout, startupinfo=startupinfo)

Parece que 'os.popen' no produce ventana de la consola. Script se ejecuta en 'pythonw'. No estoy seguro sobre todos los casos, pero en mi caso funciona bien.

os.popen(command)

Al igual que en lo que @firsthand Dicho esto, he leído en los foros wxPython-usuario que "reemplazar" la aplicación en ejecución actual, que sería "command.com" o "CMD.exe ", con pyw.exe o pythonw.exe cuando se utiliza algo como lo siguiente:

os.execl(sys.executable, *([sys.executable]+sys.argv))

otro post

A pesar de que no sé cómo lo haría io tubería en este caso.

Creo que uno de los beneficios de este enfoque es que si se ejecuta el script varias veces la barra de tareas del sistema operativo con el que no se llene de iconos CMD. La otra manera si usted tiene varios CMD minimizado en la barra de tareas y empezar a cerrar ellos, es imposible decir qué va con qué CMD guión pythonw.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top