Python “的行为”;C:“;带ntpath模块
CPython 3.4.1Python “的行为”;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
>>> 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
之间添加斜杠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
功能访问这些值。您需要使用WindowsGetEnvironmentVariable
,或通过set“
利用cmd.exe中的错误来显示所有变量,包括以“=”开头的“隐藏”变量。如果返回MS-DOS,则“C:”路径表示“磁盘上的当前目录C:”,而不是“磁盘的根目录C:“。我们不再有每个磁盘的当前目录,但我认为这仍然可以解释为什么需要使用“C:\”来引用C:@yole的根目录,Windows在“隐藏”环境变量中维护每个磁盘的当前目录,例如驱动器C:”上的当前目录的=C:
。您不能通过os.environ
或CRT的getenv
功能访问这些值。您需要使用WindowsGetEnvironmentVariable
,或通过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', ...