【问题标题】:mingw + python eagerly translating pathmingw + python 热切翻译路径
【发布时间】:2010-12-18 22:16:39
【问题描述】:

我正在使用:

我有一个看起来像绝对路径 (/path/to/dir) 的环境变量,但我正在使用它来构造一个 git URL。在某些时候,它会被翻译成C:/Program Files/Git/path/to/dir。看来 Python 出了问题:

在 git bash shell 中:

$ export VAR=/path/to/dir
$ echo $VAR
/path/to/dir
$ python
>>> import os
>>> os.environ['VAR']
'C:/Program Files/Git/path/to/dir'

git bash 不翻译路径,但 Python 是?

在 Windows 命令提示符中,Python 正确:

C:\>set VAR=/path/to/dir
C:\>echo %VAR%
/path/to/dir

C:\>python
>>> import os
>>> os.environ['VAR']
'/path/to/dir'

谁能解释这里发生了什么?以及如何防止在 bash shell 中进行翻译?

编辑:我应该补充一点,我的 python 脚本可以在 OS X 和 Windows 上运行,所以如果有人确实有解决方案,那么在这两个平台上都可以工作。

【问题讨论】:

  • 如果去掉第一个/,还会翻译吗?
  • @slurdge: 嗯...不 - 如果我删除前导斜杠翻译不会发生。

标签: python bash mingw msysgit


【解决方案1】:

这个问题听起来肯定是由 MSYS 引起的。当 MSYS 进程执行非 MSYS 进程时(例如,您的 msysgit bash shell 调用本机 Windows Python),将检查参数是否有任何看起来像绝对 POSIX 路径的内容(例如以单个“/”开头的内容),这些是转换为底层的“真实”Windows 路径,以便非 MSYS 程序可以找到它们。出于同样的原因,您的环境变量的内容也可能会发生相同的过程。

这就是为什么删除前导 '/' 有效(该值不再看起来像 POSIX 路径),为什么添加一个额外的有效(同上),以及为什么这在 Cygwin 下可以正常工作(它不是 MSYS )。我还猜测您在“C:\Program Files\Git”安装了 msysgit,这就是为什么 MSYS 认为它的“假”POSIX 文件层次结构植根于那里并将其添加到“/path/to/”的前面dir' 为您服务。

不幸的是,如果这是解释,那么就没有明确的解决方案。我遇到了一个类似的问题,试图通过 ssh 传递远程路径,但我自己没有找到任何解决这个问题的好方法,根据http://comments.gmane.org/gmane.comp.gnu.mingw.msys/4511(从 2008 年开始)的讨论,除了你的解决方法之外,根本没有明显的解决方法'到目前为止发现。如果这对您来说是一个更大的问题,您可能希望在 MinGW-MSYS 邮件列表或错误跟踪器上提出它。根据 Gmane 的讨论,尽管这是一个已知问题,但从未正式报告过。

【讨论】:

    【解决方案2】:

    您从 msysgit 获得的控制台可能已针对 git 用户的需要进行了修改,从我的 POV 来看,它仅对简单任务和访问 git 命令行有用,而不是开发和运行 python 脚本(您正在使用 Windows 的 Python 安装在为特定应用程序安装的 shell 中,这听起来不太好)。

    您应该安装 Cygwin 和他的 python 包(如果需要,甚至可以安装 git 包)以获得正确的 POSIX 环境,并为其准备好二进制文件和库。

    【讨论】:

      【解决方案3】:

      我的猜测是这不是 python 的错误,而是 git bash shell。
      当您查看变量时,可能 git bash shell 对您撒谎。
      或者,尽量不要放第一个 / 稍后再添加(如果没有发生翻译)。

      如果我尝试使用 cygwin,它可以工作:

      $ export test="/bin"
      $ python
      >>> import os
      >>> os.environ["test"]
      '/bin'
      

      【讨论】:

      • 有趣...它也不能用 2 个前导斜杠翻译。无论如何,这对我来说可能更好。因为我可以使用ssh://host//path/to/repo.git 而不是host://path/to/repo.git 来编写一个git repo URL。非常正确,git 抱怨它不知道第二种形式的协议“主机”。多么奇怪!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多