我正在使用:
我有一个环境变量看起来像一个绝对路径(/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上运行,所以如果有人有解决方案,那么在两个平台上工作都会很好。答案 0 :(得分:2)
问题肯定听起来像是由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的讨论,尽管已知问题,但从未正式报道过。
答案 1 :(得分:1)
我的猜测是,这不是python的错,而是git bash shell 当你查看变量时,也许git bash shell会对你撒谎 或者,尝试不放置第一个/并在以后再次添加(如果没有发生翻译)。
如果我尝试使用cygwin,它可以工作:
$ export test="/bin"
$ python
>>> import os
>>> os.environ["test"]
'/bin'
答案 2 :(得分:1)
你从msysgit获得的控制台可能是针对git用户的需求而修改的,从我的POV开始,它只对简单的任务有用,并且访问git命令行而不是开发和运行python脚本(你正在使用Windows的Python安装)在为特定应用程序安装的shell中,听起来不太好。)
您应该安装Cygwin和他的python包(如果需要,甚至可以安装git包)来获得正确的POSIX环境,并为其准备二进制文件和库。