我在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"
答案 0 :(得分:1)
我最终使用了不同的SVN绑定,svn-python,这很有用。我只能猜测版本的subversion和PySVN的Windows二进制文件之间存在一些不匹配。
答案 1 :(得分:0)
我认为您不需要使用子流程(仅适用于此),您可以使用:
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
祝你好运:)