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:
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.
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


0