通过Python访问时的SVN错误

1 投票
2 回答
1041 浏览
提问于 2025-04-16 07:10

我在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的程序员参考,但找不到与“svnlook youngest”相对应的调用。

编辑:我是在post-commit.bat中这样调用脚本的:

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

2 个回答

0

我觉得你不需要使用子进程(仅仅为了这个),你可以直接使用:

import os

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

print stdout.read()

奥卡姆剃刀 :)

因为在我看来,.bat 文件是比较老的东西,而子进程涉及很多重定向和处理,我觉得这样可能不太好用,但也许我错了,可能我只是想给你找个借口,不过嘛……

顺便说一下,在你的 Python 脚本中你用了 print,而在你的 .bat 文件里有 @ECHO OFF,所以我觉得这样可能不太行,也许你可以用类似这样的方式来包裹你的命令:

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

祝你好运 :)

1

我最后用了一个不同的SVN绑定工具,叫做svn-python,结果它能正常工作。我只能猜测,可能是Windows版本的subversion和PySVN之间有些不匹配的地方。

撰写回答