mingw + python 急切翻译路径
我正在使用:
- Windows XP
- Python 2.6.2(从python.org标准安装)
- git版本1.6.5.1-preview20091022(从http://code.google.com/p/msysgit/安装)
我有一个环境变量,看起来像一个绝对路径(/path/to/dir
),但我用它来构建一个git的URL。在某个时候,它被转换成了C:/Program Files/Git/path/to/dir
。看起来是Python出了问题:
在git bash命令行中:
$ 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命令行中防止这种转换?
补充说明:我应该提到我的Python脚本在OS X和Windows上都能运行,所以如果有人有解决方案,最好能在这两个平台上都有效。
3 个回答
你从msysgit得到的控制台可能是为了git用户的需求而修改过的。在我看来,它只适合做一些简单的任务和访问git命令行,而不适合开发和运行Python脚本(你是在一个为特定应用安装的shell中使用Windows的Python,这听起来不太好)。
你应该安装Cygwin和它的Python包(如果需要的话,也可以安装git包),这样你就能获得一个正确的POSIX环境,里面有为它准备好的二进制文件和库。
这个问题听起来肯定是因为MSYS引起的。当一个MSYS的进程去执行一个非MSYS的进程(比如你的msysgit bash shell调用Windows原生的Python)时,系统会检查参数中有没有看起来像绝对的POSIX路径的东西(例如,以单个'/'开头的路径),然后这些路径会被转换成Windows的真实路径,以便非MSYS的程序能够找到它们。很可能你的环境变量的内容也会因为同样的原因被这样处理。
这就是为什么去掉开头的'/'有效(因为这个值看起来不再像POSIX路径),为什么加一个额外的'/'也有效(同样的原因),以及为什么在Cygwin下这样做没有问题(因为它不是MSYS)。我还猜测你是把msysgit安装在'C:\Program Files\Git',这就是为什么MSYS认为它的“虚假”POSIX文件结构是从那里开始的,并在'/path/to/dir'前面加上了这个路径。
不幸的是,如果这就是原因,那么就没有明确的解决办法。我在尝试通过ssh传递远程路径时遇到过类似的问题,也没有找到好的解决方法。而根据2008年的讨论,除了你目前找到的解决方法之外,似乎没有明显的修复办法。如果这个问题变得更严重,你可能需要在MinGW-MSYS的邮件列表或错误追踪器上提出来。根据Gmane的讨论,这个问题虽然是个已知问题,但从来没有被正式报告过。
我猜这不是Python的问题,而是git bash这个命令行工具的问题。
可能是git bash在你查看变量时给你错误的信息。
或者,你可以试着先不要加第一个斜杠(/),等到后面再加上去(如果没有发生转换的话)。
如果我用cygwin来试的话,就能正常工作:
$ export test="/bin"
$ python
>>> import os
>>> os.environ["test"]
'/bin'