Python “的行为”;C:“;带ntpath模块

Python “的行为”;C:“;带ntpath模块,python,windows,python-3.x,Python,Windows,Python 3.x,CPython 3.4.1 >>> import ntpath as p >>> p.isabs('C:') False >>> p.isabs('C:\\') True >>> p.join('C:', 'foo') 'C:foo' >>> p.join('C:\\', 'foo') 'C:\\foo' >>> 我所期望的 >>> import ntpath as p

CPython 3.4.1

>>> import ntpath as p
>>> p.isabs('C:')
False
>>> p.isabs('C:\\')
True
>>> p.join('C:', 'foo')
'C:foo'
>>> p.join('C:\\', 'foo')
'C:\\foo'
>>>
我所期望的

>>> import ntpath as p
>>> p.isabs('C:')
True
>>> p.join('C:', 'foo')
'C:\\foo'
>>> # others the same
  • 为什么
    C:
    不是绝对的,而
    C:\
    是绝对的
  • 为什么
    ntpath.join()
    不在
    C:
    foo
    之间添加斜杠
  • 为什么C:不被认为是绝对的

    因为没有额外的斜杠,它表示“C:驱动器的当前目录”(每个驱动器在DOS/Windows中都有自己的当前目录):

    (这是C:\Windows目录的列表,而不是根目录C:\)

    为什么ntpath.join()不在C:和foo之间添加斜杠

    可能您希望文件
    foo
    位于C:drive的当前目录中

    实际结果:仅仅因为路径不是“绝对”的,并不意味着它相对于实际的当前工作目录。类似地,
    \
    是一条绝对路径,但仍取决于当前的工作驱动器

    (而且,
    riscospath
    甚至更奇怪;一般来说,POSIX是唯一一个“绝对性”是有用概念的平台。)

    为什么C:不被认为是绝对的

    因为没有额外的斜杠,它表示“C:驱动器的当前目录”(每个驱动器在DOS/Windows中都有自己的当前目录):

    (这是C:\Windows目录的列表,而不是根目录C:\)

    为什么ntpath.join()不在C:和foo之间添加斜杠

    可能您希望文件
    foo
    位于C:drive的当前目录中

    实际结果:仅仅因为路径不是“绝对”的,并不意味着它相对于实际的当前工作目录。类似地,
    \
    是一条绝对路径,但仍取决于当前的工作驱动器


    (而且
    riscospath
    甚至更奇怪;一般来说,POSIX是唯一一个“绝对性”是一个有用概念的平台。)

    如果回到MS-DOS时代,“C:”路径意味着“磁盘上的当前目录C:”,而不是“磁盘的根目录C:”。我们不再有每个磁盘的当前目录,但我认为这仍然解释了为什么需要使用“C:\”来引用C:@yole的根目录,Windows在“隐藏”环境变量中维护每个磁盘的当前目录,例如驱动器C:上的当前目录的
    =C:
    。您不能通过
    os.environ
    或CRT的
    getenv
    功能访问这些值。您需要使用Windows
    GetEnvironmentVariable
    ,或通过
    set“
    利用cmd.exe中的错误来显示所有变量,包括以“=”开头的“隐藏”变量。如果返回MS-DOS,则“C:”路径表示“磁盘上的当前目录C:”,而不是“磁盘的根目录C:“。我们不再有每个磁盘的当前目录,但我认为这仍然可以解释为什么需要使用“C:\”来引用C:@yole的根目录,Windows在“隐藏”环境变量中维护每个磁盘的当前目录,例如驱动器C:”上的当前目录的
    =C:
    。您不能通过
    os.environ
    或CRT的
    getenv
    功能访问这些值。您需要使用Windows
    GetEnvironmentVariable
    ,或通过
    set“
    利用cmd.exe中的错误来显示所有变量,包括以=“.谢谢你的回答!内核使用的路径要么是对象命名空间中的绝对路径,要么是相对于句柄的路径。驱动器C:通常映射到
    \Device\HarddiskVolume[N>=1]
    。使用驱动器C:上的当前目录解析路径,如
    C:
    ,例如到
    \Device\HarddiskVolume2\Windows
    。内核在将MS-DOS路径转换为本机命名空间时使用以下MS-DOS路径分类:UNC绝对、本地设备(例如
    \\.\con
    )。根本地设备(例如
    \\\.
    )、绝对驱动器(例如
    C:\Windows
    )、相对驱动器(例如
    C:foo
    )、根设备(例如
    \Windows
    )和相对驱动器(例如
    foo
    )。感谢您的详细回答!内核使用的路径要么是对象命名空间中的绝对路径,要么是相对于句柄的路径。驱动器C:通常映射到
    \Device\HarddiskVolume[N>=1]
    。使用驱动器C:上的当前目录解析路径,如
    C:
    ,例如到
    \Device\HarddiskVolume2\Windows
    。内核在将MS-DOS路径转换为本机命名空间时使用以下MS-DOS路径分类:UNC绝对、本地设备(例如
    \\.\con
    )。根本地设备(例如
    \\.
    )、绝对驱动器(例如
    C:\Windows
    )、相对驱动器(例如
    C:foo
    )、根设备(例如
    \Windows
    )和相对驱动器(例如
    foo
    )。
    C:\> cd Windows
    C:\WINDOWS\> python
    Python 2.7.11. (default, ...)
    >>> import os
    >>> os.listdir('C:')
    ['0.log', 'addins', 'AppPatch', ...