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!

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top