- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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.bat,sys.stdin.read()
没问题。
请帮帮我。
下面的屏幕截图:
环境:
===============[最新更新]========================
很遗憾地说:我应该写在.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 propset svn:log --revprop -r 2 "newtext"
)那么我的问题就重现了。 (要求: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/
我有以下代码可以完全按预期工作: from subprocess import Popen process = Popen( ["/bin/bash"], stdin=sys.stdi
我有一个关于 php-cli 的新问题。 我正在使用这个: define("STDIN", fopen('php://stdin','r')); $input = ""; while($input =
这个问题在这里已经有了答案: Can fseek(stdin,1,SEEK_SET) or rewind(stdin) be used to flush the input buffer inste
我正在编写一个 python 程序,它将所有输入都大写(替代非工作 tr '[:lowers:]' '[:upper:]')。语言环境是 ru_RU.UTF-8,我使用 PYTHONIOENCODIN
自从我发现 fflush(stdin) 不是处理熟悉的“换行潜伏在输入缓冲区中”问题的可移植方法,我一直在使用当我必须使用scanf时如下: while((c = getchar()) != '\n'
当我使用时在 Perl 模块( *.pm )文件中,它不会从键盘读取输入,但是当我使用 时在同一个地方它工作得很好。 为什么我使用时没有得到输入? 最佳答案 STDIN 是记录的文件句柄。还有 st
stdin 是否是一个指针,正如我在 fgets() 中看到的那样。 我使用“0”作为标准输入的读取或写入错误,并在 fgets 期间出现段错误。 STDIN宏和0是否相同。 stdin 是文件指针吗
我想知道 STDIN 和 $stdin 之间是否有任何真正的区别。我在 irb: STDIN == $stdin 并返回 true。它们只是同一事物的两个名称吗?还是有什么不同? 最佳答案 来自 Ru
有没有一种简单的方法可以将内容通过管道传输到编辑器原子? 例如: echo "Content." | atom 不幸的是atom没有获取到内容。当前版本的 gedit 具有参数 - 以启用读取 STD
这个问题已经有答案了: Using fflush(stdin) (7 个回答) 已关闭 9 年前。 我有一个这样的测试代码 #include #include #include int main
我有一个 bash启动 scp 的脚本通过以下方式: echo "${SCP_PASS:-$PASSWORD}" | ( exec 3<&0; scp -qp ${SCP_PORT:+-P$SCP_P
我正在创建一个 NASM 汇编代码来从标准输入读取文件中存在的二维数字数组我正在运行这样的可执行文件 -> ./abc < input.txt . 之后,我将在终端上显示读取的二维数组,然后我想获取箭
这是一个循环,它重复地从 stdin 获取两个字符并输出它们。 char buf[2]; while (1) { printf("give me two characters: ");
我有一个 golang 程序,可以为 jq 做一个简单的 repl。 .我希望能够在程序启动时从 stdin 读取输入到一个临时文件中,这样我就可以将 repl 与管道输入一起使用。 cat file
有没有非阻塞的 PHP 从 STDIN 读取: 我试过了: stream_set_blocking(STDIN, false); echo fread(STDIN, 1); 还有这个: $stdin
这实际上与我已经回答的另一个问题有关。这个问题在这里:Redirecting stdout of one process object to stdin of another 我的问题是(我认为)获取
我只是一个java初学者,目前正在大学学习,但由于某些原因我不会深入,我无法询问我的导师。 我在 Netbeans 中使用 StdIn 库时遇到问题。在类里面我们使用 DrJava,但由于我无法让它在
Ruby 有两种引用标准输入的方法:STDIN 常量和$stdin 全局变量。 除了我可以将不同的 IO 对象分配给 $stdin 因为它不是常量(例如,在我的 child 中 fork 重定向 IO
我是 Pythonizer 的作者我正在尝试将 CGI.pm 的代码从标准 perl 库转换为 Python。我在 read_from_client 中看到这段代码: read(\*STDIN, $$
我正在使用 laravel 5.6 并遇到问题,当我在控制台中使用命令“php artisan vendor:publish”时,出现以下错误: [ERROR] Use of undefined co
我是一名优秀的程序员,十分优秀!