2009-06-01 9 views
0

Ceci est pour un script sur lequel je travaille. Il est supposé exécuter un fichier .exe pour la boucle ci-dessous. (D'ailleurs je ne sais pas si c'est visible mais pour el in ('90', '52.6223', ...) est en dehors de la boucle et fait une boucle imbriquée avec le reste) Je ne suis pas sûr si la commande est correcte ou Quoi non. Aussi quand le fichier .exe est exécuté, il crache quelques trucs et j'ai besoin d'une certaine ligne imprimée à l'écran (d'où vous voyez AspecificLinfe = ...). Toute réponse utile serait géniale!Python et sous-processus

for el in ('90.','52.62263.','26.5651.','10.8123.'): 

    if el == '90.': 
     z = ('0.') 
    elif el == '52.62263.': 
     z = ('0.', '72.', '144.', '216.', '288.') 
    elif el == '26.5651': 
     z = ('324.', '36.', '108.', '180.', '252.') 
    else el == '10.8123': 
     z = ('288.', '0.', '72.', '144.', '216.') 

     for az in z: 

      comstring = os.path.join('Path where .exe file is') 
      comstring = os.path.normpath(comstring) 
      comstring = '"' + comstring + '"' 

      comstringfull = comstring + ' -el ' + str(el) + ' -n ' + str(z) 

      print 'The python program is running this command with the shell:' 
      print comstring + '\n' 

      process = Popen(comstring,shell=True,stderr=STDOUT,stdout=PIPE) 
      outputstring = myprocesscommunicate() 

      print 'The command shell returned the following back to python:' 
      print outputstring[0] 

       AspecificLine=linecache.getline(' ??filename?? ',  # ?? 
       sys.stderr.write('az', 'el', 'AREA')   # ?? 

Répondre

1

L'utilisation de shell=True est erronée car cela invoque inutilement le shell.

Au lieu de cela, faites ceci:

for el in ('90.','52.62263.','26.5651.','10.8123.'): 
    if el == '90.': 
     z = ('0.') 
    elif el == '52.62263.': 
     z = ('0.', '72.', '144.', '216.', '288.') 
    elif el == '26.5651': 
     z = ('324.', '36.', '108.', '180.', '252.') 
    else el == '10.8123': 
     z = ('288.', '0.', '72.', '144.', '216.') 

    for az in z: 

     exepath = os.path.join('Path where .exe file is') 
     exepath = os.path.normpath(comstring) 
     cmd = [exepath, '-el', str(el), '-n', str(z)] 

     print 'The python program is running this command:' 
     print cmd 

     process = Popen(cmd, stderr=STDOUT, stdout=PIPE) 
     outputstring = process.communicate()[0] 

     print 'The command returned the following back to python:' 
     print outputstring 
     outputlist = outputstring.splitlines() 
     AspecificLine = outputlist[22] # get some specific line. 23? 
     print AspecificLine 
+0

Peut-être que vous auriez pu ajouter que si vous passez un objet liste semblable à subprocess.Popen il gère lui-même la fuite, ce qui ne se produit pas si vous passez une chaîne. Cela aurait aidé à comprendre pourquoi vous avez utilisé une liste dans votre code;) – DasIch

+1

@DasIch: Je ne dirais pas cela, parce que c'est faux. Lorsque vous exécutez un programme, les arguments sont * toujours * passés en LISTE, jamais en tant que chaîne. C'est * votre shell * qui analyse la chaîne, puis la divise en une liste avant d'appeler la commande. Le séparateur par défaut est généralement un espace, mais vous pouvez le configurer. Les coquilles sont écrites de cette façon pour plus de commodité sur la ligne de commande. Le shell doit travailler dur pour diviser votre chaîne en liste, développer des globes comme "* .txt", etc. Puisque vous évitez le shell, vous n'avez rien à fuir: les arguments sont passés directement. Popen n'a rien à faire. – nosklo