2010-11-16 3 views
1

У меня есть Python 3.1, Subversion 1.6.12 и PySVN, установленные в Windows XP.Ошибка SVN при доступе через Python

Если открыть терминал Python и сделать

import subprocess 
print subprocess.check_output(['svnlook','youngest','D:/svn-repos/myrepo']) 

я получить ожидаемый номер версии.

Однако, если добавить этот пост-commit.bat Subversion, он терпит неудачу с ошибкой «недопустимый дескриптор»:

File "C:\Program Files\Python31\lib\subprocess.py", line 472, in check_output 
    process = Popen(*popenargs, stdout=PIPE, **kwargs) 
    File "C:\Program Files\Python31\lib\subprocess.py", line 651, in __init__ 
    errread, errwrite) = self._get_handles(stdin, stdout, stderr) 
    File "C:\Program Files\Python31\lib\subprocess.py", line 750, in _get_handles 
    p2cread = GetStdHandle(STD_INPUT_HANDLE) 
WindowsError: [Error 6] The handle is invalid 

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

Предполагая, что для этого нет прямого исправления, как бы я мог обойти это? Мне нужен способ получить самый младший номер версии из репозитория SVN без локальной рабочей копии. Я выкопал PySVN Programmer's Reference, но я не могу найти эквивалентный вызов «svnlook youngest».

Edit: Я звоню скрипт с пост-commit.bat как:

@ECHO OFF 
"C:\Program Files\Python31\python.exe" "D:\svn-repos\myrepo\hooks\myscript.py" 
+0

, как вы запускаете это из post-commit.bat, покажите нам post-commit.bat ???, потому что ошибка, которую вы показываете __STD_INPUT_HANDLE__, является стандартным вводом, который не может быть найден, поэтому я предполагаю, что .bat файл ограничен в этом вопросе – mouad

+0

Спасибо. См. Мое редактирование выше. – Cerin

ответ

1

Я закончил использование другой SVN-привязки, svn-python, и это сработало. Я могу только догадываться, что существует некоторая несоответствие между двоичными файлами Windows для версии subversion и PySVN.

0

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

import os 

stdout = os.popen('svnlook youngest D:/svn-repos/myrepo') 

print stdout.read() 

Occam's razor :)

Потому что, как я вижу здесь .bat файл старые вещи, и су bprocess, который имеет дело с большим количеством перенаправления, обработки, я не думаю, что это сработает, но, возможно, я ошибаюсь, может быть, я просто хочу найти вам оправдание, но хорошо ...

Кстати, в сценарий питона вы делаете print и у вас есть @ECHO OFF в вашем .bat, так что я не думаю, что это будет работать, может быть, вы можете обернуть вашу команду с чем-то вроде этого:

@ECHO ON 
"C:\Program Files\Python31\python.exe" "D:\svn-repos\myrepo\hooks\myscript.py" 
@ECHO OFF 

хорошо удачи :)

+0

os.system() не записывает вывод, который мне нужно сделать, потому что скрипт выполняет другие действия с номером ревизии, который он получает. Я также пробовал @ECHO, но это не повлияло. – Cerin

+0

@Chris S: см. Мое редактирование сейчас, я использую os.popen(), возможно, это может работать :), даже если os.popen() не рекомендуется, но, возможно, он может решить проблему подпроцесса. – mouad

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