2015-05-15 14 views
0

Я хочу запустить сценарий несколько раз, с разными путями в качестве аргументов и посмотреть результат.Невозможно получить вывод скрипта скрипта из python

Если я запускаю сценарий path/lizard с аргументом path_to_code/code1.cpp в командной строке

path/lizard path_to_code/code1.cpp 

я получаю выход - и я хотел бы запустить этот скрипт на несколько файлов.

Глядя на this и подобные вопросы, я попытался

import os, glob 

def run_command(command): 
    os.system(command)  

program = '"C:/Python27/Scripts/lizard.bat "' 
path = '"path_to_code/*.cpp"' 
for path1 in glob.glob(path): 
    command = program + path1 
    run_command(command) 

Нет выхода.

import glob, subprocess 

def run_command(command): 
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    out, err = p.communicate() 
    print out 

program = '"C:/Python27/Scripts/lizard.bat "' 
path = '"path_to_code/*.cpp"' 
for path1 in glob.glob(path): 
    command = program + path1 
    run_command(command) 

Нет вывода.

(конечно, я хочу, чтобы итерация рекурсивно через каталог, но это следующий шаг).

Как я могу получить результат работы программы из сценария? Я думаю, что логически обе версии должны получить мне результат ... Что я делаю неправильно?

+0

волочить пространство в двойные кавычки вокруг пути к сценарию питона выглядит неправильно для меня. Помогает ли удаление? –

+0

http://stackoverflow.com/questions/4760215/running-shell-command-from-python-and-capturing-the-output – Doon

+0

@EtanReisner без него, путь и аргумент находятся в одной строке, и нет такой программы. – Thalia

ответ

0

на основе комментариев к моему вопросу, я попытался

program = 'C:/Python27/Scripts/lizard.bat' 
... 
command = [program, path1] 

работал - и тогда я понял, что цитаты были проблемы, Этан Рейснер был прав. Устранение их заставило его работать.

Полный исправленный код:

import os, subprocess, fnmatch 

def run_command(command): 
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    out, err = p.communicate() 
    print out 

program = 'C:/Python27/Scripts/lizard.bat' 
path = 'path_to_code' 
matches = [] 
for root, dirs, filenames in os.walk(path): 
    for filename in fnmatch.filter(filenames, '*.cpp'): 
     matches.append(os.path.join(root, filename)) 

for path1 in matches: 
    command = [program, path1] 
    run_command(command) 
1

Попробуйте использовать subprocess.check_output

он должен делать то, что вы хотите.

[~] cat foo.sh 
#!/bin/sh 

echo "Hello World!" 

[~] python2.7 
Python 2.7.6 (default, Sep 9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> foo = subprocess.check_output('./foo.sh') 
>>> foo 
'Hello World!\n' 
>>> 

так в вашем конкретном примере

def run_command(command): 
    return subprocess.check_output(command,stderr=subprocess.STDOUT) 
+0

Спасибо. Моя ошибка заключалась в том, как я написал аргументы, которые был пойман Итаном Рейснером. Это хорошее обучение для меня все еще – Thalia

1

Из того, что я вижу, что вы забыли позвонить общаться на этом процессе. Попробуйте

def run_command(command): 
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    stdout, stderr = p.communicate() 
    return iter(stdout, b'') 

См https://docs.python.org/2/library/subprocess.html?highlight=popen.communicate#subprocess.Popen.communicate

Приветствия

+0

Ответ Doon может быть более подходящим для ваших нужд, но ограничивает вас Python 2.7 (если это относится к вам, то есть)) – Goldfishslayer

+0

Спасибо, я попробовал общаться ... Я написал, что в комментарии ... Моя ошибка заключалась в том, как я писал аргументы, которые были пойманы Этаном Рейснером – Thalia

+0

А, мой плохой ... некоторые комментарии были скрыты, и я их пропустил ... – Goldfishslayer

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