2017-01-26 3 views
0

Возможно ли запустить скрипт bash командной строки в python? Я знаю, что subprocess.call/check_output запускает одну команду с параметрами. Тем не менее, как мне запуститьЗапустить скрипт командной строки bash в python

for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do 
    git tag -a -m"Converting SVN tags" \ 
     `echo $tag | grep "tags/" |sed 's/.*tags\///'` \ 
     refs/remotes/$tag 
done 

in python? Я не хочу помещать «строку» в сценарий оболочки и называть его python.

Спасибо!

+1

Возможный дубликат [Как запустить команду bash внутри скрипта python?] (Http://stackoverflow.com/questions/26236126/how-to-run-bash-command-inside-python-script) – Priya

+4

Это действительно возможно порождать командные строки оболочки изнутри python, но это [проблема XY] (http://xyproblem.info/). Вы не хотите этого делать. С этим кодом лучшим вопросом будет что-то вроде: «В настоящее время я запускаю в оболочке следующее: оно работает, но может быть сделано лучше. В частности, мне нужно реализовать что-то в Python, который генерирует те же результаты. моя попытка, за которой следует сообщение об ошибке, которое я получаю при запуске ». * – ghoti

+0

Хорошим первым шагом, однако, было бы упрощение кода оболочки, который у вас есть сейчас. Например, 'git branch -r | grep "//могут быть заменены на' git branch --list -r 'tags/*' '. Подстановка команды, используемая в качестве аргумента для 'git tag', может (возможно) быть заменена просто' '$ {tag # * tags /}" '. – chepner

ответ

1

При преобразовании из Баш скрипт на Python вы можете пойти двумя путями:

  1. вы взять на себя программные вызовы и просто заменить Контурные/обработки строк, например, как это:

    from subprocess import check_output 
    for line in check_output('git branch -r', shell=True).split("\n"): 
        line = line.strip() 
        # do your replaces here, etc. leaving that for an exercise for you 
        # run more `check_call` or `check_output` here 
    
  2. вы делаете это «правильный путь» и использовать, например, a python git module. Это изначально больше работы, но долгосрочная перспектива выгодно, как вы получите больше из особенностей коробки, и имеете меньше ошибок, чем в ваших «быстро взломаны вместе SHELL вызовов»

Edit: Как комментатор справедливо предположить, вы должны стараться избегать shell=True. В этом случае check_output(['git', 'branch', '-r']), безусловно, лучше, в других случаях, когда вы знаете, что скрипт python будет запущен в системах Linux и под определенной оболочкой (например, bash), тогда с shell=True вы сможете получить доступ к переменным среды, указанным в .bashrc, делать глобусы и т. Д. Подробное обсуждение см. В here.

+0

Вам лучше с 'check_output (['git', 'branch', '-r'])' без 'shell = True', поскольку оболочка не вносит ничего полезного здесь, кроме разделения команды на которые вы можете легко сделать сами. (Конечно, это немного менее разборчиво, но преимущества сильно перевешивают это незначительное неудобство.) См. Также http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess – tripleee

+0

@tripleee: thanks для указателя, как правило, я думаю, что 'shell = True' сглаживает путь от оболочки до python, но, конечно же, в конце вам нужен скрипт, который работает повсюду, что, конечно же, не так с shell = True. Я добавил раздел ответа – hansaplast

+1

Очень хорошее обновление, +1. Я склонен предостерегать от 'shell = True', потому что люди склонны копировать/вставлять код из Stack Overflow без понимания последствий, и поэтому конструкции с существенными побочными эффектами являются проблематичными, по крайней мере, если вы их не вызываете. – tripleee

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