Domanda
Sto eseguendo uno script per alimentare un file exe una dichiarazione come di seguito:
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
Sto usando il prompt dei comandi e quando eseguo l'exe con questi numeri ci sono momenti in cui non sembra essere in ordine. Come a volte stamperà 3 dichiarazioni del 52.62263 ma poi prima che siano tutte stampate stamperà un singolo 26.5651 e poi tornerà a 52.62263. Non sono solo quei numeri che si comportano così. Esecuzioni diverse possono essere numeri diversi (A 52.62263 tra "due" 90 dichiarazioni). Tutto sommato, voglio che lo stampi in ordine dall'alto verso il basso. Qualche suggerimento e utilizzo del mio codice eventuali soluzioni utili? grazie!
Soluzione
Penso che ciò che sta accadendo in questo momento sia che non stai aspettando che quei processi finiscano prima che vengano stampati. Prova qualcosa del genere nelle tue ultime 2 righe:
from subprocess import Popen, STDOUT
stdout, stderr = Popen('echo ' + cmd, shell=True, stderr=STDOUT).communicate()
print stdout
Altri suggerimenti
z = ('0.')
non è una tupla, quindi il tuo ciclo per k in z
ripeterà i caratteri " 0 " e ". " ;. Aggiungi una virgola per dire a Python che vuoi che sia una tupla:
z = ('0.',)
Ciò che ha detto spigoloso. E questo è un po 'più pulito; stampa, ma ti viene l'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
Dato che hai pubblicato alcuni post su questo bit di codice, permettimi di correggere / pythonify / abbellire il tutto:
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