代码之家  ›  专栏  ›  技术社区  ›  Cerin

通过Python访问时出现SVN错误

  •  1
  • Cerin  · 技术社区  · 14 年前

    我在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存储库中检索最新的修订号,而不需要本地工作副本。我已经挖遍了派斯文的 Programmer's Reference ,但我找不到与“svnlook younger”等价的电话。

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

    @ECHO OFF
    "C:\Program Files\Python31\python.exe" "D:\svn-repos\myrepo\hooks\myscript.py"
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Cerin    14 年前

    最后我使用了一个不同的SVN绑定,SVN python,并且成功了。我只能猜测subversion版本的Windows二进制文件和PySVN之间存在一些不匹配。

        2
  •  0
  •   mouad    14 年前

    我认为您不需要使用子流程( 只是为了这个 ),您可以使用:

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

    Occam's razor :)

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

    顺便说一下,在python脚本中 print 你已经 @ECHO OFF 在你的 .蝙蝠 所以我不认为它会起作用也许你可以用这样的东西来包装你的命令:

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

    祝你好运:)