2013-03-11 4 views
0

У меня есть фрагмент bash, который я хотел бы передать на Python. Он находит, где находится SVN, и является ли он исполняемым.Как я могу использовать эту конструкцию теста bash в Python?

SVN=`which svn 2>&1` 
if [[ ! -x $SVN ]]; then 
    echo "A subversion binary could not be found ($SVN)"   
fi 

Вот моя текущая попытка в Python с помощью модуля подпроцесс:

SVN = Popen('which svn 2>&1', shell=True, stdout=PIPE).communicate()[0] 
Popen("if [[ ! -x SVN ]]; then echo 'svn could not be found or executed'; fi", shell=True) 

Это не работает, потому что в то время как у меня есть расположение СВН сохраняется в локальном пространстве имен Python, я могу» t получить доступ к нему из Popen.

Я также попытался объединения в один объект POPEN:

Popen("if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi", shell=True) 

Но я получаю эту ошибку (и, разумеется, выглядит очень громоздким)

/bin/sh: -c: line 0: syntax error near `;' 
/bin/sh: -c: line 0: `if [[ ! -x 'which svn 2>&1']]; then echo 'svn could not be found'; fi' 

Есть версия Python теста построить "-x"? Я думаю, это было бы идеально. Также будут оценены и другие способы обхода.

Благодаря

+1

[этот сайт] (http://ubuntuforums.org/showthread.php?t=1457094) предоставляет фрагмент кода, который выглядит как 'commands.getoutput (" если [-x MyFile] \ Nthen эхо верно \ НИЛ ")'. Однако это вряд ли «переносит на Python», поскольку вы все еще ссылаетесь на Bash. – Kos

+1

'os.stat' может предоставить вам некоторую информацию о заданном файле, например о его разрешениях, но я думаю, что вам еще нужно создать над ним« исполняемый файл для текущего пользователя ». – Kos

+1

можете ли вы сохранить команду bash как строку сначала, чтобы вы могли связать ее с переменной SVN? затем передайте это Popen() ... – Jeff

ответ

1
SVN = Popen('which svn 2>&1', shell=True, stdout=PIPE).communicate()[0] 
str="if [[ ! -x " + SVN + " ]]; then echo 'svn could not be found or executed'; fi" 
Popen(str, shell=True) 
+1

Это крайне неэффективно, оно много вилки и оставляет зомби вокруг. – LtWorf

4

Это самое простое решение:

path_to_svn = shutil.which('svn') 
is_executable = os.access(path_to_svn, os.X_OK) 

shutil.which нового в Python 3.3; есть полипол в this answer. Вы можете взять путь от Popen тоже, если вы действительно этого хотите, но это необязательно.

И вот документы для os.access.

+0

'os.access()' избыточно. 'shutil.which()' уже проверяет 'X_OK' по умолчанию. – jfs

1

Нет необходимости использовать, который вы уже можете попробовать запустить svn без параметров, и если он работает, это значит, что он есть.

try: 
    SVN = subprocess.Popen('svn') 
    SVN.wait() 
    print "svn exists" 
except OSError: 
    print "svn does not exist" 
Смежные вопросы