-->

为什么试图sys.stdin.read()在颠覆的pre-revprop变化PY脚本时,我收到“坏文

2019-09-22 12:06发布

我在Windows机器上尝试的pre-revprop-change钩子脚本,但发现一个棘手的问题。

我提炼我的问题在以下情形:

我有C:\ csvn \数据\库\ TR1 \钩\的pre-revprop-change.bat与内容:

D:\svntest\testhook.py %*
exit %ERRORLEVEL%

testhook.py是:

import os, sys

if __name__ == '__main__':
    # sys.stderr.write(sys.version+'\n') # this is OK, tried.
    newtext = sys.stdin.read() # try to read new log message

    sys.stderr.write('newtext is: %s\n'%newtext)

    exit(2)

然而,做一个客户端时svn propset svn:log --revprop -r 2 "newtext" ,我得到了蟒蛇的错误:

Traceback (most recent call last):
  File "D:\svntest\testhook.py", line 5, in <module>
    newtext = sys.stdin.read() # try to read new log message
IOError: [Errno 9] Bad file descriptor

这是什么错误的原因是什么?

看来的pre-revprop-change.bat不通过STDIN处理对PY脚本。 是的,我验证的pre-revprop-change.bat可以(根据获取的指令从标准输入文本在批处理文件中读取标准输入流 )。

我还试图直接从命令行运行的pre-revprop-change.bat, sys.stdin.read()是确定。

请您帮我出。

下面的屏幕截图:

ENV:

  • Windows Server 2003中
  • CollabNet的Subversion的边缘2.3(SVN 1.7.3和Apache 2.2.22)
  • 安装Python从python.org 2.7.1 MSI

=============== [最新] ======================

我很抱歉地说:我应该写在蝙蝠

exit %ERRORLEVEL%

代替

exit /b %ERRORLEVEL%

对于有人谁与我试了一下,请修复它,然后再试一次。 该/b似乎有的pre-revprop-change.bat永远退出以0 TIP:如果没有/b ,直接从一个cmd窗口运行.bat将导致cmd窗口关闭,所以我们最好有尝试cmd /c "pre-revprop-change.bat some param"

快捷方式下面重现此问题

更重要的是,对于那些谁是仍然有兴趣,请

  • 下载这个文件包http://down.nlscan.com/misc/chjsvnpyhook.zip ,
  • 他们解压到d:\,
  • cd到d:\ svntest \ tr1_local,
  • elog.bat运行( svn propset svn:log --revprop -r 2 "newtext"

那么我的问题会得到再现。 (要求:svn.exe 1.7命令行(或CollabNet的TortoiseSVN的),和Python 2.7是否安装)

如果仍然无法重现错误。 我已经准备恰好表现出的问题VMware虚拟机。 下载VM在http://down.nlscan.com/misc/chj/winxp-svnhook-py-stdin-error.7z (链接预期是有效的,直到2013年9月)。 VMware播放3.0(免费),足以运行的虚拟机。

=============== [解决方法FOUND] ===================

通过@nmenezes提供了非常不错的解决方法是, c:\Python27\python.exe D:\svntest\testhook.py %*的蝙蝠。

Answer 1:

SVN正在执行该脚本没有关联的控制台。 所以你不会看到在标准输出显示任何内容。 发送到STDERR一切显示为上SVN一个消息时,如果脚本返回0不同的错误代码。

这种脚本应该无人值守运行,它独立于用户输入或输出。

你可以尝试通过属性值作为一个额外的命令行参数。 要做到这一点,改变你的蝙蝠到:

@echo off
set /p NEWTEXT=
test.py %* %NEWTEXT%
exit /b %ERRORLEVEL%

而到的.py:

import os, sys

if __name__ == '__main__':   
    newtext = sys.argv[6]
    sys.stderr.write('newtext is: %s\n'% newtext)
    exit(2)

我读了一批STDIN到NEWTEXT变量,我把它传递给你的脚本作为一个额外的命令行参数。

这种解决方案并不多行值工作。 于是,我又试了你原来的解决方案,它工作得很好。

svn propset svn:log --revprop -r 3 -F svn.txt

在这种情况下,该属性值从svn.txt文件,多行文本文件中读取。 在这种情况下,集/ P选项不起作用,因为我们在评论中讨论。 但原来的脚本工作。

有关信息,5个属性传递在命令行上:

1 - 库

2 - 版本号

3 - 用户

4 - 属性名

5 - 操作(在这种情况下M)

该属性值传递批处理脚本的标准输入。

@Chen,我终于下载了图像。 当您更改钩批次的问题就解决了:

c:\python27\python.exe d:\svntest\testhook.py %*
exit %ERRORLEVEL%

看起来,你的XP机器直接执行蟒蛇的方式是错误配置。



Answer 2:

是不是到你的批处理文件来指挥它到它调用脚本接收标准输入?

供参考: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

也许你可以只前缀调用你的脚本>符号有这种情况呢?

> D:\svntest\testhook.py %*
exit /b %ERRORLEVEL%

好像如果批处理文件可以从标准输入读取,然后SVN是做什么它应该是,它是由你的批处理文件,以使其可用于您调用其他脚本。



文章来源: Why do I get 'Bad file descriptor' when trying sys.stdin.read() in subversion pre-revprop-change py script?