博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python path.join 不同平台结果不同
阅读量:2433 次
发布时间:2019-05-10

本文共 1723 字,大约阅读时间需要 5 分钟。

转载:

 

问题描述

我一直以为Python是隔离了操作系统的差异,同样的function在不同操作系统下会有一致的结果,直到前几天临时切换到Windows下发现有些Python代码跑不出来,才发现如os.path.join()这样的方法在不同操作系统下的表现是不一致的。

例如

Python

import os.pathprint(os.path.join('a', 'b', 'c'))

在Linux/macOS下会显示

a/b/c

而在Windows下会显示

a\b\c

os.path.join()在Linux/macOS下会以斜杠(/)分隔路径,而在Windows下则会以反斜杠(\)分隔路径

这种不一致的表现在遇到jinja2下include模板文件路径时就会由于jinja2只支持斜杠(/),而在Windows下使用os.path.join()会出现反斜杠(\),而造成找不到模板文件错误,参考这个。

原因分析

这种内置标准库方法的不一致从哪来的?官方文档实际上早就有明显的暗示了。

os.path的官方文档页面开始位置就提到源代码文件根据不同操作系统在三个不同文件中:

Source code: (for POSIX), (for Windows NT), and (for Macintosh)

可见在安装Python时就会根据不同操作系统,仅使用对应操作系统类别的os.path模块。如果顺着源码去看,就会发现os.path.join()在Linux下是以斜杠(/)作为分隔符的,而在Windows下则是以反斜杠(\)作为分隔符的。

Mac的一些细节

如果跟着看Macintosh操作系统对应的源码的话,会很惊讶地发现Macintosh下不是以斜杠(/)也不是以反斜杠(\),而是以冒号(:)作为分隔符的,是不是很震惊:我的mac怎么可能是以冒号(:)为分隔符的?!

这其实是一个历史问题了,这里仅应用到了2001发布的Mac OS X之前的Macintosh操作系统中,那时的Macintosh确实是用冒号(:)为分隔符的。而从2001年的Mac OS X开始,到2012年的OS X,再到2016年的macOS,都采用了遵循Unix的斜杠(/)分隔符,也就直接使用Linux的源码了。

为什么Windows要使用反斜杠(\

为什么Windows不使用斜杠(/),而独树一帜使用反斜杠(\)呢,专门为了为难程序员?

这其实也是个历史问题,归根到底还是因为Windows为了保持对DOS的兼容性,而DOS为什么要使用反斜杠(\)就说来话长了,可以参考MSDN上的一篇博文:。

解决方法

从上面的分析可以发现os.path.join()仅包含对应操作系统类型的实现,所以我们无法通过指定参数的形式生成诸如适用于Linux或Windows的路径,那么如何解决这一问题呢?这里以在Windows下生成Linux格式(斜杠(/)分隔符)路径为例来说明。

通过str.replace()

这是一种简单直接的方法,直接把Windows下os.path.join()生成的反斜杠(\)全部替换为斜杠(/),如:

Python

import os.pathresult = os.path.join('a', 'b', 'c')print(result)result = result.replace('\\', '/')print(result)

会得到

a\b\ca/b/c

通过pathlib.PurePath.as_posix()

从Python 3.4开始可以通过pathlib.PurePath.as_posix()来生成斜杠(/)格式的路径,其实其实现原理和str.replace()并没有太大区别。例如:

Python

import os.pathfrom pathlib import Pathresult = os.path.join('a', 'b', 'c')print(result)result = Path(result).as_posix()print(result)

会得到

a\b\ca/b/c

参考

你可能感兴趣的文章
链表算法面试题---删除链表中的重复元素II
查看>>
链表算法面试题---合并两个链表
查看>>
链表算法面试题---旋转链表
查看>>
链表算法面试题---交换链表的节点I
查看>>
链表算法面试题---交换链表的节点II
查看>>
链表算法面试题---链表的插入排序
查看>>
链表算法面试题---链表的归并排序
查看>>
链表算法面试题---合并N个有序链表
查看>>
链表算法面试题---分割链表
查看>>
总结、归类---使用二分处理旋转数组的问题
查看>>
分布式常用技术
查看>>
uniapp DES加解密
查看>>
小程序DES加解密
查看>>
Vue 路由 导航守卫(全局守卫、路由独享守卫)
查看>>
ajax图片上传
查看>>
小程序数组去重
查看>>
微信小程序生成分享海报
查看>>
值得收藏的 CSS 形状
查看>>
H5屏幕宽度大小自适应方式
查看>>
中秋诗歌两首
查看>>