Python y si la declaración
-
06-07-2019 - |
Pregunta
Estoy ejecutando un script para alimentar un archivo exe con una declaración como la siguiente:
for j in ('90.','52.62263.','26.5651.','10.8123.'):
if j == '90.':
z = ('0.')
elif j == '52.62263.':
z = ('0.', '72.', '144.', '216.', '288.')
elif j == '26.5651':
z = ('324.', '36.', '108.', '180.', '252.')
else:
z = ('288.', '0.', '72.', '144.', '216.')
for k in z:
exepath = os.path.join('\Program Files' , 'BRL-CAD' , 'bin' , 'rtarea.exe')
exepath = '"' + os.path.normpath(exepath) + '"'
cmd = exepath + '-j' + str(el) + '-k' + str(z)
process=Popen('echo ' + cmd, shell=True, stderr=STDOUT )
print process
Estoy usando el símbolo del sistema y cuando ejecuto el exe con estos números, hay momentos en que no parece estar en orden. Como a veces, imprimirá 3 declaraciones de 52.62263 pero luego, antes de que se impriman todas, imprimirá un solo 26.5651 y luego volverá a 52.62263. No son solo esos números los que actúan así. Diferentes ejecuciones pueden ser números diferentes (A 52.62263 entre " dos " 90 declaraciones). Con todo, quiero que lo imprima en orden de arriba a abajo. ¿Alguna sugerencia y utilizando mi código alguna solución útil? gracias!
Solución
Creo que lo que está sucediendo en este momento es que no está esperando que esos procesos finalicen antes de que se impriman. Pruebe algo como esto en sus últimas 2 líneas:
from subprocess import Popen, STDOUT
stdout, stderr = Popen('echo ' + cmd, shell=True, stderr=STDOUT).communicate()
print stdout
Otros consejos
z = ('0.')
no es una tupla, por lo tanto, su bucle for k in z
iterará sobre los caracteres " 0 " y ''. '' Agregue una coma para decirle a Python que desea que sea una tupla:
z = ('0.',)
Lo que dijo eduffy. Y esto es un poco más limpio; solo imprime, pero tienes la idea:
import os
data = {
'90.': ('0.',),
'52.62263.': ('0.', '72.', '144.', '216.', '288.'),
'26.5651.': ('324.', '36.', '108.', '180.', '252.'),
'10.8123.': ('288.', '0.', '72.', '144.', '216.'),
}
for tag in data:
for k in data[tag]:
exepath = os.path.join('\Program Files', 'BRL-CAD', 'bin', 'rtarea.exe')
exepath = '"' + os.path.normpath(exepath) + '"'
cmd = exepath + ' -el ' + str(tag) + ' -az ' + str(data[tag])
process = 'echo ' + cmd
print process
Dado que ha publicado algunas publicaciones sobre este fragmento de código, permítame corregir / pythonify / embellecer todo:
for j,z in {
'90.' : ('0.',) ,
'52.62263.' : ('0.', '72.', '144.', '216.', '288.') ,
'26.5651.' : ('324.', '36.', '108.', '180.', '252.') ,
'10.8123.' : ('288.', '0.', '72.', '144.', '216.')
}.iteritems():
for k in z:
exepath = os.path.join('\Program Files' , 'BRL-CAD', 'bin' , 'rtarea.exe')
exepath = '"%s"' % os.path.normpath(exepath)
cmd = exepath + '-j' + str(el) + '-k' + z
process = Popen('echo ' + cmd, shell=True, stderr=STDOUT )
print process