【问题标题】:python program works fine from command line and as git difftool, but dies as external-diffpython 程序从命令行和 git difftool 工作正常,但作为 external-diff 死
【发布时间】:2013-06-21 19:07:13
【问题描述】:

这是正常运行的程序,它正在死去,但有一个很好的理由(因为文件ab 不存在)。

% dmp_diff a b
{'LESS': '-R', 'LC_CTYPE': 'en_US.UTF-8', 'SHELL': '/usr/local/bin/zsh', 'LOGNAME': 'lust', 'USER': 'lust', 'HOME
': '/Users/lust', 'PATH': '/Users/lust/bin:/Users/lust/util:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/loc
al/share/python:/opt/X11/bin:/Users/lust/bin:/Users/lust/util:/usr/local/share/npm/bin:/usr/local/share/npm/bin',
 'DISPLAY': '/tmp/launch-uW8956/org.macosforge.xquartz:0', 'TERM_PROGRAM': 'iTerm.app', 'LANG': 'en_US.UTF-8', 'T
ERM': 'xterm-256color-italic', 'Apple_PubSub_Socket_Render': '/tmp/launch-rPIGNa/Render', 'SHLVL': '2', 'SECURITY
SESSIONID': '186a4', 'ITERM_SESSION_ID': 'w0t0p0', '_': '/Users/lust/util/dmp_diff', 'GREP_COLOR': '1;32', 'SSH_A
UTH_SOCK': '/tmp/launch-pgXEyS/Listeners', 'TMUX': '/private/var/folders/z_/ybb_x1f96l9d2yqr18ncmg1w0000gn/T/tmux
-501/default,19104,0', 'GREP_OPTIONS': '--color=auto', 'ITERM_PROFILE': 'Default', 'TMPDIR': '/var/folders/z_/ybb
_x1f96l9d2yqr18ncmg1w0000gn/T/', 'LSCOLORS': 'Gxfxcxdxbxegedabagacad', 'OLDPWD': '/Users/lust', '__CF_USER_TEXT_E
NCODING': '0x1F5:0:0', 'Apple_Ubiquity_Message': '/tmp/launch-V9NNsf/Apple_Ubiquity_Message', 'PWD': '/Users/lust
/.vim', 'PAGER': 'less', 'TMUX_PANE': '%10', 'COMMAND_MODE': 'unix2003'}
Files: a b
Traceback (most recent call last):
  File "/Users/lust/util/dmp_diff", line 46, in <module>
    file_content = open(filename, 'r').read()
IOError: [Errno 2] No such file or directory: 'a'
> /Users/lust/util/dmp_diff(46)<module>()
     45     file_process = Popen(['file', '-'], stdin=PIPE, stdout=PIPE)
---> 46     file_content = open(filename, 'r').read()
     47     file_content = map(lambda x: x.encode('string_escape')

ipdb>

[diff]
    external = dmp_diff

当我用 git 运行外部差异时,我得到了这个;它死于一个不好的原因(注意它只到了第 16 行而不是第 46 行):

% git diff
{'LESS': '-R', 'GIT_PAGER_IN_USE': 'true', 'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'LC_CTYPE': 'en_US.UTF-8', 'SH
ELL': '/usr/local/bin/zsh', 'LOGNAME': 'lust', 'USER': 'lust', 'HOME': '/Users/lust', 'PATH': '/usr/libexec/git-c
ore:/usr/bin:/Users/lust/bin:/Users/lust/util:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/pytho
n:/opt/X11/bin:/Users/lust/bin:/Users/lust/util:/usr/local/share/npm/bin:/usr/local/share/npm/bin', 'DISPLAY': '/
tmp/launch-uW8956/org.macosforge.xquartz:0', 'TERM_PROGRAM': 'iTerm.app', 'LANG': 'en_US.UTF-8', 'GIT_PREFIX': ''
, 'TERM': 'xterm-256color-italic', 'Apple_PubSub_Socket_Render': '/tmp/launch-rPIGNa/Render', 'VERSIONER_PYTHON_V
ERSION': '2.7', 'SHLVL': '2', 'SECURITYSESSIONID': '186a4', 'ITERM_SESSION_ID': 'w0t0p0', '_': '/usr/bin/git', 'G
REP_COLOR': '1;32', 'SSH_AUTH_SOCK': '/tmp/launch-pgXEyS/Listeners', 'TMUX': '/private/var/folders/z_/ybb_x1f96l9
d2yqr18ncmg1w0000gn/T/tmux-501/default,19104,0', 'GREP_OPTIONS': '--color=auto', 'ITERM_PROFILE': 'Default', 'TMP
DIR': '/var/folders/z_/ybb_x1f96l9d2yqr18ncmg1w0000gn/T/', 'LSCOLORS': 'Gxfxcxdxbxegedabagacad', 'OLDPWD': '/User
s/lust/util/.git', '__CF_USER_TEXT_ENCODING': '0x1F5:0:0', 'Apple_Ubiquity_Message': '/tmp/launch-V9NNsf/Apple_Ub
iquity_Message', 'PWD': '/Users/lust/util', 'GIT_DIR': '.git', 'PAGER': 'less', 'TMUX_PANE': '%9', 'COMMAND_MODE'
: 'unix2003'}
Traceback (most recent call last):
  File "/Users/lust/util/dmp_diff", line 16, in <module>
    import ipdb
ImportError: No module named ipdb
external diff died, stopping at .dmp_diff.un~.
(END)

现在,如果我将 dmp_diff 作为 git difftool 运行,这可以正常工作。但是,这对我来说还不够,因为我想将这个差异程序用于git log -p 之类的东西,这样我就不需要想出一堆脆弱的脚本,而且我已经习惯了运行git log -p 已经(但想要改进的 git 输出)。

我可以说(显然)在第二种情况下,python 无法找到 ipdb。我不确定要使它正常工作缺少什么。如果有人能告诉我如何从 python 加载一个比import 提供更多控制的模块,我将不胜感激。 imp.find_module,也许?如果有人知道 Git 的疯狂行为导致了这种情况,我也会很高兴。

我也知道 git 将要比较的文件名作为第二个和第七个参数发送(而不是作为第一个和第二个参数);我的 dmp_diff 程序已经解决了这个问题(它与当前的问题无关)。

【问题讨论】:

  • 你安装了多个版本的python吗?
  • 哦,嘿,可能是它!

标签: python git git-diff


【解决方案1】:

感谢@ThomasFenzl 的提示,确实 git 正在运行 python 2.7.2,而从命令行运行的是 2.7.5。仍然不完全确定为什么它找不到 ipdb lib 目录,但它肯定是一个很好的起点。

显然使用#!/usr/bin/env python 而不是指定确切的python 二进制路径(在我的系统上是规范的/usr/local/bin/python)会导致它在从git 运行时获取系统的原始python。

我认为我仍然需要退回到/usr/bin/env python 方法,因为我需要它的环境之一只在我的用户目录中安装了 python。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多