通过Python访问时出现SVN错误

时间:2010-11-16 22:05:13

标签: python windows svn

我在Windows XP上安装了Python 3.1,Subversion 1.6.12和PySVN。

如果我打开一个Python终端并执行

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

我得到了预期的修订号。

但是,如果我将此添加到Subversion的post-commit.bat,则会失败,并显示错误“句柄无效”:

  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最年轻”相同的调用。

编辑:我从post-commit.bat调用脚本,如:

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

2 个答案:

答案 0 :(得分:1)

我最终使用了不同的SVN绑定,svn-python,这很有用。我只能猜测版本的subversion和PySVN的Windows二进制文件之间存在一些不匹配。

答案 1 :(得分:0)

我认为您不需要使用子流程(仅适用于此),您可以使用:

import os

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

print stdout.read()

Occam's razor:)

因为我从这里看到它.bat文件是旧的东西,并且处理大量重定向的子进程,处理我认为这不会起作用,但也许我错了,也许我只是我想找个借口,但是...... ...

顺便说一句,在python脚本中你执行print并且@ECHO OFF中有.bat所以我认为它不会起作用也许你可以用你的命令包裹像这样的东西:

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