os.path.join - 我可以在Windows和Cygwin之间获得一致性吗?

Ste*_*sop 5 python windows filenames cygwin

我非常喜欢一组文件名组件,它们会在Windows和Cygwin上为我提供一致且"漂亮"的文件名.这是我尝试过的:

  Input                                Windows      Cygwin
1 os.path.join('c:', 'foo', 'bar')     c:foo\bar    c:/foo/bar
2 os.path.join('c:\\', 'foo', 'bar')   c:\foo\bar   c:\/foo/bar
3 os.path.join('c:/', 'foo', 'bar')    c:/foo\bar   c:/foo/bar
Run Code Online (Sandbox Code Playgroud)

1不是我想要的Windows,我想要一个绝对路径,而不是相对于当前目录.

2和3都起作用,但不是(我在此定义)"漂亮",因为它们在一个平台或另一个平台上混合前后斜线.如果我可以避免这种情况,我的错误和日志消息将更具可读性.

选项4是在Windows和Cygwin 上定义一个driveroot等于变量的变量.或者是一个带驱动器号并返回相同功能的功能.但我更愿意避免这两者之间的平台特殊情况.c:\/cygdrive/c

我可以拥有我想要的一切(加入相同的路径组件,在两个平台上提供引用相同绝对路径的结果,并且不在任何平台上混合路径分隔符)?或者我必须在某处妥协?

[编辑:如果它有帮助,主要用例是c:\foo我在配置时知道的路径,而bar(和其他组件)稍后计算.所以我的实际代码目前看起来更像这样:

dir = os.path.join('c:\\', 'foo')

# some time later

os.path.join(dir, 'bar')
Run Code Online (Sandbox Code Playgroud)

这是使用选项2,这导致Windows中的文件名"很好"报告,但在Cygwin中报告文件名"不好".如果可能的话,我想避免的是:

if this_is_cygwin():
    dir = '/cygdrive/c/foo'
else:
    dir = 'c:\\foo'
Run Code Online (Sandbox Code Playgroud)

]

Die*_*Epp 4

编辑: David 指出我对 Windows 上“当前目录”的理解是错误的。对不起。但是,如果您不需要绝对路径os.path.abspath,请尝试使用 来获得漂亮的路径。os.path.normpath

在方法1中,

os.path.join('c:', 'foo', 'bar')
Run Code Online (Sandbox Code Playgroud)

输出c:foo\bar是正确的。这意味着当前目录foo\bar下面的路径,它与根目录不同。 正在完全按照您的指示进行操作,即获取(驱动器 c 上的当前目录)并向其添加一些额外的位。c:os.path.joinc:

在方法2中,

os.path.join(r'c:\', 'foo', 'bar')
Run Code Online (Sandbox Code Playgroud)

Cygwin 的输出是正确的,因为在 Cygwin 中,c:\不是驱动器的根。

你想要的就是os.abspath功能。这将为您提供您所提供的路径的绝对标准化版本。

但是:在 Cygwin 和 Windows 上您不会得到相同的字符串。我希望你不是在寻找那个。