4

我在用:

我有一个看起来像绝对路径 ( /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 上运行,所以如果有人确实有解决方案,那么在这两个平台上都可以工作。

4

3 回答 3

2

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

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

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

于 2011-03-10T13:28:54.003 回答
1

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

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

$ export test="/bin"
$ python
>>> import os
>>> os.environ["test"]
'/bin'
于 2009-11-20T23:27:34.197 回答
1

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

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

于 2009-12-23T06:44:51.160 回答