2009-06-01 5 views
0

Это для сценария, над которым я работаю. Предполагается запустить файл .exe для цикла ниже. (Кстати, не уверен, что он виден, но для el in ('90', '52.6223', ...) находится за пределами цикла и делает вложенный цикл с остальными). Я не уверен, правильно ли упорядочение или что нет. Также, когда запускается файл .exe, он выплескивает некоторые вещи, и мне нужна определенная строка, напечатанная на экране (следовательно, там, где вы видите AspecificLinfe = ...). Любые полезные ответы были бы замечательными!Python и подпроцесс

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')   # ?? 

ответ

1

Использование shell=True неверно, потому что этот бесполезный вызов оболочки.

Вместо этого:

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

Может быть, вы могли бы добавить, что если вы передаете список объект, похожий на subprocess.Popen он обрабатывает сам побег, который не произойдет, если вы передаете строку. Это помогло бы понять, почему вы использовали список в своем коде;) – DasIch

+1

@DasIch: Я бы не сказал этого, потому что это неправильно. Когда вы запускаете какую-либо программу, аргументы всегда передаются как LIST, а не как строка. Это * ваша оболочка *, которая анализирует строку, а затем разбивает ее на список перед вызовом команды. Разделитель по умолчанию обычно является пространством, но вы можете его настроить. Оболочки написаны таким образом для удобства в командной строке. Оболочка должна работать, чтобы разделить вашу строку в список, расширить шарики, как «* .txt» и т.д. Так как вы избегаете оболочку, вы просто не избежать ничего: аргументы передаются непосредственно. Попэн ничего не должен делать. – nosklo

Смежные вопросы