Я пытаюсь найти способ проверить существование команды оболочки перед ее выполнением.
Например, я выполню команду 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 переменную?
Кроме того, есть ли более легкий способ сделать то, что я пытаюсь сделать?
Можно использовать модуль подпроцесса в соответствии с 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')
Я наконец оставил это прокладыванием себе путь:
попытка:
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()
разве Вы не могли использовать, "которые" управляют так или иначе? то, которые управляют автоматически, выполняет поиск для приложения в путях. Я думаю, что необходимо было бы просто назвать эту команду и передать название команды, которую Вы хотите искать, затем проанализировать результаты.
Для таких ситуаций я использую:
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'