classification
Title: On Windows os.listdir('') -> cwd and os.listdir(u'') -> C:\
Type: behavior Stage: test needed
Components: Library (Lib), Windows Versions: Python 3.1, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: ocean-city Nosy List: ezio.melotti, loewis, ocean-city, pitrou, r.david.murray
Priority: high Keywords: patch

Created on 2009-05-03 13:44 by ezio.melotti, last changed 2009-05-04 06:21 by ezio.melotti. This issue is now closed.

Files
File name Uploaded Description Edit
listdir_on_empty_path.patch ocean-city, 2009-05-04 01:51
Messages (9)
msg87045 - (view) Author: Ezio Melotti (ezio.melotti) * (Python committer) Date: 2009-05-03 13:44
On Windows, with Python2/Python3, os.listdir('')/os.listdir(b'') list
the content of the current working directory and
os.listdir(u'')/os.listdir('') the content of C:\.

On Linux the error "OSError: [Errno 2] No such file or directory: ''" is
raised.

I also noticed that os.listdir('C:') (without the \) lists the content
of the cwd too.
msg87054 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2009-05-03 17:36
As for the "C:" behaviour, I think it is normal: you are not specifying
the path itself, only the drive letter, so it uses the current path in
the specified drive (which /is/ cwd if you are already running from C:,
but may be something else if running from another drive).

As for '' and b'', I think that ambiguity is bad and these values should
be prohibited by Python (ValueError comes to mind).
msg87056 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2009-05-03 17:45
Before anything is changed, I would first like to understand where the
difference comes from.

If it gives ENOENT on Unix, it should also give ENOENT on Windows
(rather than giving ValueError). In addition, it should also give what
open("")/open(b"") gives - as it really is the request to open the
directory named "". (disclaimer: I haven done any tests or code review yet)
msg87080 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2009-05-03 22:22
On Sun, 3 May 2009 at 17:36, Antoine Pitrou wrote:
> As for the "C:" behaviour, I think it is normal: you are not specifying
> the path itself, only the drive letter, so it uses the current path in
> the specified drive (which /is/ cwd if you are already running from C:,
> but may be something else if running from another drive).

It is normal behavior for Windows.  Try it with the 'dir' command
in a command window.  (That said, I have no idea, not being a
Windows user, how Windows decides what the 'current' directory
is on any given drive from any given context).
msg87094 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-05-04 01:51
I hope attached patch works.

>>> import os
>>> os.listdir("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
WindowsError: [Error 3] 指定されたパスが見つかりません。: ''
[36200 refs]
>>> os.listdir(u"")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
WindowsError: [Error 3] 指定されたパスが見つかりません。: u''

# Error message says "Cannot find specified path"
msg87095 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-05-04 02:01
For u"", os.listdir calls FindFirstFileW with u"\\*.*",
For "", os.listdir calls FindFirstFileA with "*.*".

The code before FindFirstFile[AW] is slightly different for empty path.
msg87097 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2009-05-04 04:18
Hirokazu, the patch looks fine, please apply to 2.7 and 3k.

I wouldn't backport it to 2.6/3.0, since it may break existing code.
msg87099 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-05-04 05:59
Committed in r72273(trunk) and r72274(py3k).
msg87101 - (view) Author: Ezio Melotti (ezio.melotti) * (Python committer) Date: 2009-05-04 06:21
> It is normal behavior for Windows.  Try it with the 'dir' command
> in a command window.  (That said, I have no idea, not being a
> Windows user, how Windows decides what the 'current' directory
> is on any given drive from any given context).

Yes, I tried to run cmd.exe and I did:

C:\> cd D:\foo
C:\> cd E:\foo
C:\> python

os.listdir('D:') and os.listdir('E:') then listed the content of D:\foo
and E:\bar. This is the correct behaviour, even if it's not documented.
The CWD is the one where Python has been launched, and apparently on the
other drives is the root folder by default, if it's not changed with the
cd command.

Thanks Hirokazu for the patch.
History
Date User Action Args
2009-05-29 02:46:22benjamin.petersonlinkissue818059 superseder
2009-05-04 06:21:53ezio.melottisetmessages: + msg87101
2009-05-04 05:59:55ocean-citysetstatus: open -> closed
resolution: accepted -> fixed
messages: + msg87099
2009-05-04 04:18:45loewissetassignee: ocean-city
resolution: accepted
messages: + msg87097
2009-05-04 02:01:25ocean-citysetmessages: + msg87095
2009-05-04 01:51:15ocean-citysetfiles: + listdir_on_empty_path.patch

nosy: + ocean-city
messages: + msg87094

keywords: + patch
2009-05-03 22:22:06r.david.murraysetnosy: + r.david.murray
messages: + msg87080
2009-05-03 17:45:58loewissetmessages: + msg87056
2009-05-03 17:36:55pitrousetpriority: high
versions: - Python 2.6, Python 2.5, Python 2.4, Python 3.0
nosy: + loewis, pitrou

messages: + msg87054

stage: test needed
2009-05-03 13:45:00ezio.melotticreate