2017-01-18 3 views
-1

У меня возникли проблемы с пониманием функции подпроцесса в Python 2.7. У меня есть некоторые команды в сценарии оболочки, которые я пытаюсь преобразовать в Python, например, svn export -r 5 ..., но я не хочу зависеть от библиотеки, такой как pysvn, для этого. Решением этого (насколько я понимаю) является использование подпроцесса и просто запуск каждой отдельной команды, которая будет в сценарии оболочки. Должно ли это быть достигнуто subprocess.call("svn export -r 5", shell=True)? Или Popen что я должен смотреть? Я знаю, что было сказано, что вам следует избегать shell=True, но в моем случае нет проблем с безопасностью или возможной ошибки пользователя. Любой совет будет принят во внимание.Пытаясь обойти pysvn, могу ли я использовать функцию подпроцесса для записи вызовов svn в сценарии оболочки?

+0

Не используйте 'pysvn'. Используйте привязки SWIG Python: http://svnbook.red-bean.com/en/1.8/svn.developer.usingapi.html#svn.developer.usingapi.otherlangs – bahrep

+0

Я стараюсь избегать загрузки каких-либо библиотек, поэтому я я использую подпроцесс, но все же полезно отметить примечание SWIG. –

ответ

0

subprocess.call просто тонкая оболочка вокруг subprocess.Popen, что ожидает завершение процесса:

def call(*args, **kwargs): 
    return Popen(*args, **kwargs).wait() 

Единственной причины, чтобы использовать оболочку для запуска вашей команды, если вы хотите запустить какую-то более или менее сложную оболочку команда. С помощью простой простой команды и ее аргументов лучше передать один список строк, состоящий из имени команды и ее аргументов.

subprocess.call(["svn", "export", "-r", "5"]) 

Если вы пишете функцию, которая могла бы, например, взять номер версии в качестве аргумента можно передать, что svn export до тех пор, как вы убедитесь, что это строка:

def svn_export(r): 
    subprocess.call(["svn", "export", "-r", str(r)]) 
Смежные вопросы