【问题标题】:Create relative path and being OS independent创建相对路径并独立于操作系统
【发布时间】:2020-05-17 18:12:13
【问题描述】:

如何将我的脚本文件名作为cwd 的相对路径并且它独立于操作系统?

例如,如果我在 linux 中,它应该返回“./script.py”,如果我在 Windows 中,它应该返回“.\\script.py”

我尝试使用 os.path.joinos.path.basename(__file__) 但它返回绝对路径。

【问题讨论】:

  • 有趣的事实:Windows 暂时可以使用正斜杠。
  • @KlausD。当然,Windows 可以使用正斜杠。但是当我执行os.walk 时,它会返回带有反斜杠的文件名......因此,如果我想将两个文件路径作为字符串进行比较,我也必须创建带有反斜杠的字符串。
  • @KlausD.,有趣的事实:许多 Windows API 函数根本不支持斜杠作为路径分隔符,例如 Windows 8 中添加的 pathcch 函数。例如,PathCchCombineEx 加入 "C:/spam""/eggs" 错误地为"C:/spam\\/eggs",因为它不将“/”作为路径分隔符处理。但是,对于 "C:\\spam""\\eggs",它会正确返回 "C:\\eggs"。还有很多其他这样的例子。只有基本文件 API 可靠地支持斜杠作为路径分隔符 - 并且仅在 规范化 路径中,而不是在非规范化“\\?\”前缀路径中。

标签: python linux windows path operating-system


【解决方案1】:
import os
import platform

path = os.path.basename(__file__)
run_on=platform.system()
if run_on=='Windows': path=f'.\\{path}'
elif run_on=='Linux': path=f'./{path}'

print(f'path is {path}')

【讨论】:

  • script_name = ".\\" + os.path.basename(__file__) if platform.system() == 'Windows' else "./" + os.path.basename(__file__) 成功了。谢谢。
【解决方案2】:

为什么不简单地让os 为您处理呢?

path = os.path.normcase(os.path.join('.', os.path.relpath(__file__)))

【讨论】:

  • 返回小写的路径。对于windows来说没关系。但对于我的字符串比较来说,这很重要。如何避免小写?
  • 删除normcase 不会改变大小写,但这就是使用它进行路径比较的全部意义所在。例如,os.path.normcase('./foo\\BAR/baz.BLAH') == os.path.normcase('.\\foo\\bar\\baz.blah')True,因为 normcase 修复了斜线并使大小写对我们来说是一致的。
  • 是的,这不是为什么我不急于使用您的解决方案,即使它是有效的。我必须在walk 返回的每条路径上都使用它的原因是让我感到厌烦。使用@n1tr0xs 解决方案,我只需执行一次即可获得脚本的正确相对路径。希望这是有道理的。
  • 那么你只需要os.path.join('.', os.path.relpath(__file__)),如果你与walked文件进行比较,因为它们的斜线应该已经被修复了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2013-04-21
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多