【问题标题】:Python path.join behavior is different when run in Mac vs Windows在 Mac 和 Windows 中运行时,Python path.join 行为不同
【发布时间】:2013-08-10 21:44:39
【问题描述】:

我想要我的项目,内置于 PYTHON 中,以在任何终端(MAC、CYGWIN、Windows 等)中支持 Windows Linux MAC。我可以实现,但是当我运行以下命令时遇到了一些问题

import os
mypath = os.path.join('users','scripts', 'pythonsample')
print mypath

在windows命令提示符输出是

users\scripts\pythonsample

在MAC终端输出是

users/scripts/pythonsample

另外,当我运行以下代码时

import glob
glob.glob(os.path.join('users','scripts', 'pythonsample','*.*'))

在windows命令提示符输出是

[users/scripts\\pythonsample\\a1.py,
users/scripts\\pythonsample\\a2.py,
users/scripts\\pythonsample\\a3.py
users/scripts\\pythonsample\\a4.py]

在MAC终端输出是

[users/scripts/pythonsample/a1.py,
users/scripts/pythonsample/a2.py,
users/scripts/pythonsample/a3.py
users/scripts/pythonsample/a4.py]

所以在多个平台上解析和获取没有完整路径的文件名变得很困难。

我可以编写一个 if else 块来决定脚本是在 Windows、MAC 还是 CGYWIN 中运行。

import sys
#Output of below command is Win32, linux2, darwin, cgywin 
print(sys.platform)

但是有没有一种简单的方法可以在没有 if else 阻塞的情况下完成此操作?

【问题讨论】:

  • 您真正想要的输出是什么?即使在 Windows 上,您也想要 POSIX 样式的路径吗?您是否希望始终获得 Windows 风格的路径,而不是仅在大多数情况下在 Windows 上获得?还是有什么不同?而且,最重要的是,请解释为什么你想要那个。你目前得到的有什么问题?
  • 如果 glob.glob(somepath) 输出在整个操作系统中是相同的,那么我可以使用 string.split('\\') 分割路径。我将不得不将其更改为 Windows 中的 string.split('\\') MAC 中的 string.split('/')。
  • 你为什么使用string.split?你已经在使用os.path;也可以使用它的方法来拆分东西!

标签: python parsing python-2.7 operating-system


【解决方案1】:

这正是您应该期待的。在 Windows 上,os.path 为您提供 Windows 样式的路径;在 Mac OS X 上,它为您提供 POSIX 样式的路径。

如果您希望保证所有的 POSIX 路径,请不要使用 os.path,而是使用 posixpath

另一方面,如果您的路径即使在 Windows 上也可能是 POSIX 格式(因为 Windows 的大多数部分都处理 POSIX 样式的路径,并且许多工具会生成 POSIX 样式的路径)并且想要保证您有一个本地路径,请致电os.path.normpath

【讨论】:

  • 如果 glob.glob(somepath) 输出在整个操作系统中是相同的,那么我可以使用 string.split('\\') 分割路径。我将不得不将其更改为 Windows 中的 string.split('\\') MAC 中的 string.split('/')。
  • 如果需要,您可以随时s.split(os.pathsep),这将在 Windows 上拆分为反斜杠,并在其他地方拆分为斜杠。但是os.path 的全部意义在于您不必处理这些废话。只需使用os.path 中的方法处理路径即可。
  • os.pathsep 在 Windows 中不起作用。 >>> c = os.path.abspath('..') >>> c.split(os.pathsep) ['C:\\Users\\Admin\\Desktop']
  • @Venkatesh:对不起,是的,我的意思是os.sep。感谢指正;否则很容易让未来的读者感到困惑!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2013-10-02
  • 2021-02-13
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多