Ошибка SVN при доступе через Python - PullRequest
1 голос
/ 17 ноября 2010

У меня установлен Windows Python 3.1, Subversion 1.6.12 и PySVN.

Если я открою терминал Python и сделаю

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

Я получил ожидаемый номер ревизии.

Однако, если я добавлю это в post-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 , но не могу найти эквивалентный вызов "svnlook youngest".

Редактировать: я вызываю скрипт из post-commit.bat как:

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

Ответы [ 2 ]

1 голос
/ 10 января 2011

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

0 голосов
/ 17 ноября 2010

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

import os

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

print stdout.read()

бритва Оккама :)

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

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

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

ну, удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...