Python: Проверьте существование команды оболочки перед [закрытым] выполнением

Я пытаюсь найти способ проверить существование команды оболочки перед ее выполнением.

Например, я выполню команду ack-grep. Так, я пытаюсь сделать:

подпроцесс импорта
от подпроцесса импортируют КАНАЛ

cmd_grep = подпроцесс. Popen (["ack-grep", "-без цветов", "-max-count=1", "-без групп", "определение run_main", "../cgedit /"], stdout=PIPE, stderr=PIPE)

Чем, если я выполняюсь

cmd_grep.stderr.read ()

Я получаю '' как вывод. Но у меня нет команды ack-grep на моем пути. Так, почему Popen не помещает сообщение об ошибке на мою .stderr переменную?

Кроме того, есть ли более легкий способ сделать то, что я пытаюсь сделать?

3
задан 04.06.2010, 18:47

4 ответа

Можно использовать модуль подпроцесса в соответствии с Python 3 или модуль команд для Python 2 следующим образом:

состояние, результат = subprocess.getstatusoutput ("ls - al")

состояние, результат = commands.getstatusoutput ("ls - al")

Затем протестируйте значение status.

Примеры с веб-сайта:

>>> import subprocess
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')
>>> subprocess.getstatusoutput('cat /bin/junk')
(256, 'cat: /bin/junk: No such file or directory')
>>> subprocess.getstatusoutput('/bin/junk')
(256, 'sh: /bin/junk: not found')
3
ответ дан 08.12.2019, 00:07

Я наконец оставил это прокладыванием себе путь:

попытка:

    cmd_grep = ["ack-grep", "--no-color", "--max-count=1", "--no-group", function_definition, file_path]

    first_exec = Popen(cmd_grep,stdout=PIPE)

    execution = Popen(cmd_sed, shell=True, stdin=first_exec.stdout, stdout=PIPE)

except:

    #use grep instead

    cmd_grep = cmd_grep = r'grep -R -n "' + function_definition + '" ' + file_path

    execution = Popen(cmd_grep + '|' + cmd_sed,shell=True,stdout=PIPE)

output = execution.stdout.read()
0
ответ дан 08.12.2019, 00:07

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

2
ответ дан 08.12.2019, 00:07

Для таких ситуаций я использую:

def find_program(prog_filename, error_on_missing=False):
    bdirs = ['$HOME/Environment/local/bin/',
             '$HOME/bin/',
             '/share/apps/bin/',
             '/usr/local/bin/',
             '/usr/bin/']
    paths_tried = []
    for d in bdirs:
        p = os.path.expandvars(os.path.join(d, prog_filename))
        paths_tried.append(p)
        if os.path.exists(p):
            return p
    if error_on_missing:
        raise Exception("*** ERROR: '%s' not found on:\n  %s\n" % (prog_filename, "\n  ".join(paths_tried)))
    else:
        return None

Затем можно сделать что-то как:

grep_path = find_program('ack_grep', False)
if grep_path is None:
    # default to standard system grep
    grep_path = 'grep'
1
ответ дан 08.12.2019, 00:07

Теги

Похожие вопросы