Python - Problema con os.system en cadena con espacios

   
Vista:

Problema con os.system en cadena con espacios

Publicado por Mario Santos (1 intervención) el 13/07/2016 09:39:39
Hola a todos.

Tengo un problema con un código que estoy haciendo. Quiero ejecutar un comando de consola para lanzar un renderizado de blender en segundo plano. Para ello he hecho una aplicación gráfico con tkinter. El problema surge al final, cuando llamo a blender. El ejecutable de blender se encuentra en la carpeta:

C:\Program Files\Blender Foundation\Blender\blender.exe

El código que estoy utilizando es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import tkinter
from tkinter import *
 
from tkinter import messagebox
import tkinter.filedialog
import os
#import subprocess
 
root = tkinter.Tk()
 
root.title("Render Blender - MS")
#root.call('wm', 'attributes', '.', '-topmost', True)
 
titulo = tkinter.Label(root, text="Mario Santos - Aplicación para el renderizado en Blender")
titulo.grid(column=0, row=0, columnspan=3)
 
lblfilein = tkinter.Label(root, text="archivo .blend de entrada")
lblfilein.grid(column=0, row=1)
 
pentrada = tkinter.Entry(root)
pentrada.grid(column=1, row=1)
 
def btnpath():
    filename = tkinter.filedialog.askopenfilename(parent=root, title="Selecciona un ficher")
    pentrada.insert(0,filename)
 
def btnsalida():
    carpetasalida = tkinter.filedialog.askdirectory()
    psalida.insert(0, carpetasalida)
 
 
imagen = tkinter.PhotoImage(file="./lupa.gif")
 
btnPath = tkinter.Button(root, image=imagen, command=btnpath)
btnPath.grid(column=2, row=1)
 
lblfileout = tkinter.Label(root, text="carpeta de salida")
lblfileout.grid(column=0, row=2)
 
psalida = tkinter.Entry(root)
psalida.grid(column=1, row=2)
 
lblFrameInicio = tkinter.Label(root, text="Introduce posicion de frame inicio")
lblFrameInicio.grid(column=0, row=4)
lblFrameInicio.configure(state=DISABLED)
inpFrameInicio = tkinter.Entry(root)
inpFrameInicio.grid(column=1, row=4)
lblFrameInicio.configure(state=DISABLED)
lblFrameFinal = tkinter.Label(root, text="Introduce posicion de frame final")
lblFrameFinal.grid(column=0, row=5)
lblFrameFinal.configure(state=DISABLED)
inpFrameFinal = tkinter.Entry(root)
inpFrameFinal.grid(column=1, row=5)
inpFrameFinal.configure(state=DISABLED)
 
 
lblsegundos = tkinter.Label(root, text="Segundos antes del apagado", state=DISABLED)
lblsegundos.grid(column=0, row=6)
intsegundos = tkinter.Entry(root, state=DISABLED)
intsegundos.grid(column=1, row=6)
optforzadoapagado = tkinter.IntVar()
optforzadoapagado.set(0)
chkforzadoapagado = tkinter.Checkbutton(root, text="Forzar el apagado", variable=optforzadoapagado, state=DISABLED)
chkforzadoapagado.grid(column=0, row=7)
 
btnOut = tkinter.Button(root, image=imagen, command=btnsalida)
btnOut.grid(column=2, row=2)
 
def animacion_apagado(*argumentos):
    if optAnimacion.get() == 1:
        lblFrameInicio.configure(state=NORMAL)
        inpFrameInicio.configure(state=NORMAL)
        lblFrameFinal.configure(state=NORMAL)
        inpFrameFinal.configure(state=NORMAL)
 
    elif optAnimacion.get() == 0:
        lblFrameInicio.configure(state=DISABLED)
        inpFrameInicio.configure(state=DISABLED)
        lblFrameFinal.configure(state=DISABLED)
        inpFrameFinal.configure(state=DISABLED)
 
    if optApagado.get() == 1:
        lblsegundos.configure(state=NORMAL)
        intsegundos.configure(state=NORMAL)
        chkforzadoapagado.configure(state=NORMAL)
    elif optApagado.get() == 0:
        lblsegundos.configure(state=DISABLED)
        intsegundos.configure(state=DISABLED)
        chkforzadoapagado.configure(state=DISABLED)
 
 
 
 
 
optAnimacion = tkinter.IntVar()
optAnimacion.set(0)
chkAnimacion = tkinter.Checkbutton(root, text="Animacion", variable=optAnimacion, command=animacion_apagado)
chkAnimacion.grid(column=0, row=3)
 
optApagado = tkinter.IntVar()
optApagado.set(0)
chkApagado = tkinter.Checkbutton(root, text="Apagar equipo al finalizar", variable= optApagado, command=animacion_apagado)
chkApagado.configure(justify=tkinter.RIGHT)
chkApagado.grid(column=1, row=3)
 
def funcion_renderizar(*arg):
    if optApagado.get() == 0:
        respuesta = tkinter.messagebox.askyesno("Atencion", "Se va a renderizar el fichero " + str(pentrada.get()) + " en la carpeta " + str(psalida.get()))
    else:
        respuesta = tkinter.messagebox.askyesno("Atencion", "Se va a renderizar el fichero " + str(pentrada.get()) + " en la carpeta " + str(psalida.get()) + " y posteriormente se cerrara el equipo")
    if respuesta:
        print("renderizando............")
 
        comando = '"C:\Program Files\Blender Foundation\Blender\blender.exe"'
        print(comando)
        os.system(comando)
 
 
 
 
    else:
        pentrada.delete(0,'end' )
        psalida.delete(0,'end')
        intsegundos.delete(0,'end')
        inpFrameFinal.delete(0, 'end')
        inpFrameInicio.delete(0, 'end')
        optApagado.set(0)
        optAnimacion.set(0)
        optforzadoapagado.set(0)
        animacion_apagado()
 
btnRenderizar = tkinter.Button(root, text="Renderizar", width=12, command=funcion_renderizar)
btnRenderizar.grid(column=1, row=8)
 
def salir():
    root.destroy()
 
btnSalir = tkinter.Button(root, text="Salir", command=salir, width=12)
btnSalir.grid(column=2, row=8)
 
 
root.mainloop()

Y el error que me aparece cuando ejecuto la aplicación es:
"C:\Program " No se reconoce como comando externo.

He probado a poner las comillas de varias formas, utilizar en vez del os.system el subprocess.call y no me funciona de ninguna manera.

Muchas gracias por vuestra ayuda y un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Problema con os.system en cadena con espacios

Publicado por xve (1235 intervenciones) el 13/07/2016 11:03:59
Hola Mario, haz un par de pruebas...

Prueba quitando las comillas dobles:
1
comando = 'C:\Program Files\Blender Foundation\Blender\blender.exe'

o poniendo tres comillas dobles
1
comando = """C:\Program Files\Blender Foundation\Blender\blender.exe"""

Coméntanos cual te ha funcionado, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con os.system en cadena con espacios

Publicado por dario (53 intervenciones) el 13/07/2016 11:27:12
Probado en Linux Mint.
1
2
3
import os
ruta = '/usr'bin'vlc'
os.system(ruta)
Con este codigo me abre el vlc sin problemas, no uso windows pero supongo que debe ser algo parecido para la ruta.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar