| msg87045 - (view) |
Author: Ezio Melotti (ezio.melotti) *  |
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) *  |
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) *  |
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) *  |
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) *  |
Date: 2009-05-04 01:51 |
| I hope attached patch works. >>> import os >>> os.listdir("") Traceback (most recent call last): File "", line 1, in WindowsError: [Error 3] 指定されたパスが見つかりません。: '' [36200 refs] >>> os.listdir(u"") Traceback (most recent call last): File "", line 1, in WindowsError: [Error 3] 指定されたパスが見つかりません。: u'' # Error message says "Cannot find specified path" |
|
|
| msg87095 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
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) *  |
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) *  |
Date: 2009-05-04 05:59 |
| Committed in r72273(trunk) and r72274(py3k). |
|
|
| msg87101 - (view) |
Author: Ezio Melotti (ezio.melotti) *  |
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. |
|
|