gpt4 book ai didi

python - 为什么我在 subversion pre-revprop-change py 脚本中尝试 sys.stdin.read() 时得到 'Bad file descriptor'?

转载 作者:行者123 更新时间:2023-11-28 18:51:23 25 4
gpt4 key购买 nike

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

我将我的问题提炼为以下场景:

我有 C:\csvn\data\repositories\tr1\hooks\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" 时,出现了 python 错误:

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 可以从 STDIN 获取文本(根据 Read stdin stream in a batch file 中的说明)。

我还尝试直接从命令行运行 pre-revprop-change.batsys.stdin.read() 没问题。

请帮帮我。

下面的屏幕截图:

enter image description here

环境:

  • window 服务器 2003
  • Collabnet Subversion Edge 2.3(svn 1.7.3 和 Apache 2.2.22)
  • 从 python.org 安装 Python 2.7.1 msi

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

很遗憾地说:我应该写在.bat中

exit %ERRORLEVEL%

代替

exit /b %ERRORLEVEL%

有和我一起试过的人,请修复它,然后再试一次。 /b 似乎有 pre-revprop-change.bat 总是以 0 退出。提示:如果没有 /b,直接从 cmd 窗口运行 .bat 将导致cmd 窗口关闭,所以我们最好用 cmd/c "pre-revprop-change.bat some param" 试试。

下面重现此问题的快速方法

另外,还有兴趣的 friend ,请

那么我的问题就重现了。 (要求:svn.exe 1.7命令行(无论是collabnet还是TortoiseSVN),安装Python 2.7)

如果仍然无法重现错误。我准备了一个 VMware 虚拟机来准确地展示问题。在 http://down.nlscan.com/misc/chj/winxp-svnhook-py-stdin-error.7z 下载虚拟机(链接预计有效期至 2013 年 9 月)。 VMware Player 3.0(免费)足以运行该 VM。

===============[找到解决方法]===================

@nmenezes 提供的非常好的解决方法,在 bat 中使用 c:\Python27\python.exe D:\svntest\testhook.py %*

最佳答案

SVN 在没有关联控制台的情况下执行脚本。所以您不会在 STDOUT 上看到任何显示。如果脚本返回不同于 0 的错误代码,则发送到 STDERR 的所有内容都会在 SVN 上显示为一条消息。

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

您可以尝试将属性值作为额外的命令行参数传递。为此,将您的 .bat 更改为:

@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 文件中读取的,该文件是一个包含多行的文本文件。在这种情况下,带有 set/p 的选项不起作用,正如我们在评论中所讨论的那样。但原始脚本有效。

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

1 - 存储库

2 - 修订号

3 - 用户

4 - 属性名称

5 - 操作(在本例中为 M)

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

@Chen,我终于下载了图片。把hook batch改成:

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

看来你的XP机器直接执行python的方式配置错误

关于python - 为什么我在 subversion pre-revprop-change py 脚本中尝试 sys.stdin.read() 时得到 'Bad file descriptor'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12453354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com