如何在 Python Git hook 中使用 raw_input() ?

2023-11-27

我正在为 Git 编写一个预提交钩子,它运行 pyflakes 并检查修改文件中的制表符和尾随空格(Github 上的代码)。我想通过请求用户确认来覆盖钩子,如下所示:

answer = raw_input('Commit anyway? [N/y] ')
if answer.strip()[0].lower() == 'y':
    print >> sys.stderr, 'Committing anyway.'
    sys.exit(0)
else:
    print >> sys.stderr, 'Commit aborted.'
    sys.exit(1)

此代码会产生错误:

Commit anyway? [N/y] Traceback (most recent call last):
  File ".git/hooks/pre-commit", line 59, in ?
    main()
  File ".git/hooks/pre-commit", line 20, in main
    answer = raw_input('Commit anyway? [N/y] ')
EOFError: EOF when reading a line

是否可以在 Git hooks 中使用 raw_input() 或类似的函数,如果可以,我做错了什么?


你可以使用:

sys.stdin = open('/dev/tty')
answer = raw_input('Commit anyway? [N/y] ')
if answer.strip().lower().startswith('y'):
    ...

git commit calls python .git/hooks/pre-commit:

% ps axu
...
unutbu   21801  0.0  0.1   6348  1520 pts/1    S+   17:44   0:00 git commit -am line 5a
unutbu   21802  0.1  0.2   5708  2944 pts/1    S+   17:44   0:00 python .git/hooks/pre-commit

向内看/proc/21802/fd(在此 Linux 机器上)显示 PID 为 21802 的进程的文件描述符的状态(pre-commit过程):

  /proc/21802/fd:
  lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 0 -> /dev/null
  lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 1 -> /dev/pts/1
  lrwx------ 1 unutbu unutbu 64 2011-09-15 17:45 2 -> /dev/pts/1
  lr-x------ 1 unutbu unutbu 64 2011-09-15 17:45 3 -> /dev/tty
  lr-x------ 1 unutbu unutbu 64 2011-09-15 17:45 5 -> /dev/null

Thus, pre-commit产生于sys.stdin指着/dev/null. sys.stdin = open('/dev/tty')重定向sys.stdin到一个打开的文件句柄raw_input可以阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python Git hook 中使用 raw_input() ? 的相关文章

随机推荐

  • 以编程方式更新 Android 操作系统

    我正在从事一个移动设备管理项目 我们项目的要求之一是以编程方式更新 Android 设备操作系统 流程如下 服务器发送有关操作系统更新的推送通知 Android 客户端下载更新 现在我想以编程方式更新 Android 设备操作系统 我怎样才
  • 如何根据特定索引范围对 ArrayList 进行排序

    我的需要是根据特定的索引范围对字符串的 ArrayList 进行排序 例如 我的列表中有以下项目 abc xyz pqr asd 现在我想从索引 1 到最后一个索引对该列表进行排序 一种方式我认为我可以从具有所需索引范围的主列表创建一个子列
  • Delphi:检查文件是否正在使用

    我想写入 删除文件 但有时如果该文件正在被另一个程序使用 我会崩溃 如何检查文件是否被其他进程打开或者我可以打开它进行写入 问题是 在您检查是否可以获得独占访问权限和打开文件之间 其他东西获得了对该文件的独占访问权限 无论如何您都会收到异常
  • 如何分散客户使用 IE6 的注意力

    我们如何才能分散客户使用 IE6 的注意力 我们知道IE6并不是一个很好的符合标准的浏览器 有很多问题 如何满足客户不使用IE6 谢谢 我目前正在为我的公司建立一个新网站 我一直在考虑http code google com p ie6 u
  • Node.js:获取响应时间

    如何知道 URL 的响应时间 我在用着http get 发出 HTTP GET 请求 没有内置函数或值来获取响应时间 但您自己可以轻松获得该值 var http require http var start new Date http ge
  • Haskell 函数名中 ' 的含义?

    什么是报价 用于 我已经阅读了有关柯里化函数的内容 并阅读了定义 add 函数的两种方法 柯里化和非柯里化 咖喱版本 myadd Int gt Int gt Int myadd x y x y 但即使没有引号 它也同样有效 那么这有什么意义
  • appengine-mapreduce 达到内存限制

    我正在研究 appengine mapreduce 函数 并修改了演示以适应我的目的 基本上我有超过一百万行 格式如下 userid time1 time2 我的目的是找到每个用户 ID 的 time1 和 time2 之间的差异 但是 当
  • grep 最后一场比赛及其以下几行

    我已经学会了如何grep比赛前后的线路以及grep上一场比赛 但我还没找到如何做grep最后一场比赛及其下方的线条 该场景是服务器日志 我想列出命令的动态输出 该命令可能在一个服务器日志中使用多次 所以我想匹配将是命令并且以某种方式grep
  • HTML 范围滑块和 jQuery?

    我的网站中有以下代码 并使用 HTML5 集成了范围滑块 我希望滑块用值更新文本输入 反之亦然 我会使用 jQuery 来做到这一点吗 如果可以的话你能给我示例代码吗 Thanks
  • SELECT COUNT(*) 昂贵吗?

    您认为在每次页面加载时对一个非常大的表 例如 50K 行 中的条目进行计数是一个好主意吗 SELECT COUNT FROM table 现在我有大约 2000 行 看起来相当快 我没有看到页面加载有任何延迟 但表应该达到 50K 条目 我
  • 使用 wix 生成可执行文件

    我正在学习 Wix 我想生成 setup exe 文件而不是 setup msi 那可能吗 安装 EXE 通常称为引导程序 or chainer WiX 3 5 将附带一个名为burn exe 不幸的是 这仍在大力开发中 如果您只是想要一个
  • 验证AWS API网关的请求路径参数?

    假设我有一个带有路径的 api and pets and pets pet 现在我正在尝试验证路径 pets 参数 以便只有长度为 6 的字母数字字符的路径才会被验证并处理到后端 lambda 所有其他路径都将被拒绝 我尝试了以下 swag
  • 我可以使用 gmail 作为我网站的 smtp 服务器吗

    您好 我正在尝试建立并运行一个网站 它目前托管在 AWS 上 因此我目前没有运行自己的 smtp 服务器 所以在阅读了几篇文章后 我了解到我们可以使用gmail作为smtp服务器 我想仔细检查我读到的内容是否正确 我将使用智能求职板软件 我
  • 在C++ Win32中创建透明窗口

    我正在创建一个非常简单的 Win32 C 应用程序 其唯一目的是仅显示半透明的 PNG 窗口不应该有任何镶边 并且所有不透明度都应该在 PNG 本身中控制 我的问题是 当窗口下的内容发生变化时 窗口不会重新绘制 因此 PNG 的透明区域与应
  • 从互联网下载 SQLite 数据库并加载到 Android 应用程序中

    对于我的 Android 应用程序 我想使用一个大型数据库 大约 45 MB 一种解决方案是将 拆分的 数据库包含在资产文件夹中 并在第一次启动时将其复制到数据库目录 但这会消耗两次磁盘空间 一次在无法删除文件的资产文件夹中 一次在文件已复
  • 在DLL接口中使用boost::shared ptr可以吗?

    在 C 中开发一个返回 boost 共享指针并将其用作参数的 DLL 是否有效 那么 这样导出函数可以吗 1 boost shared ptr
  • 竞技编程中的快速输入/输出

    我在竞争性编程竞赛的解决方案中多次遇到过这个特定的代码片段 我了解此代码的基本用途来克服时间限制 但我想更深入地了解它 我知道 unistd h 可以访问系统调用包装函数 例如 fork pipe 和 I O 原语 读 写等 如果有人可以解
  • 如何创建 GUI 并以编程方式对 Cocoa 事件做出反应?

    我发现了如何以编程方式在 Cocoa 中创建一个窗口 但不知道如何对事件做出反应 该窗口不对退出请求或按钮单击做出反应 我尝试添加以下控制器并使用 setDelegate setTarget 但没有运气 interface AppContr
  • 使用 hibernate 以编程方式验证架构

    在大多数项目中 运行你的方法java app模式验证是使用该配置 使用 spring 时 spring jpa hibernate ddl auto validate 我遇到了一个问题 我需要在运行期间的特定时间验证我的架构 有什么方法可以
  • 如何在 Python Git hook 中使用 raw_input() ?

    我正在为 Git 编写一个预提交钩子 它运行 pyflakes 并检查修改文件中的制表符和尾随空格 Github 上的代码 我想通过请求用户确认来覆盖钩子 如下所示 answer raw input Commit anyway N y if