通过Python访问时的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的程序员参考,但找不到与“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之间有些不匹配的地方。