On 10/21/15, Serhiy Storchaka <storch...@gmail.com> wrote: > On 21.10.15 04:25, Gregory P. Smith wrote: >> https://www.python.org/dev/peps/pep-0008/#names-to-avoid >> >> /"Since module names are mapped to file names, and some file systems are >> case insensitive and truncate long names, it is important that module >> names be chosen to be fairly short -- this won't be a problem on Unix, >> but it may be a problem when the code is transported to older Mac or >> Windows versions, or DOS."/ >> >> There haven't been computers with less than 80 character file or path >> name element length limits in wide use in decades... ;) > > We should also avoid special file names like con.py or lpt1.py.
Other file names to avoid on Windows are conin$.py, conout$.py, aux.py, prn.py, nul.py, lpt[1-9].py, and com[1-9].py. Using these device names in a file name requires the fully qualified wide-character path, prefixed by \\?\. Incidentally this prefix also allows paths that have up to 32768 characters, if there's concern that long module names in packages might exceed the Windows 260-character limit. Here's an example of what would actually be opened for con.py, etc, at least on my current Windows 10 machine: devs = ('aux prn com1 com9 lpt1 lpt9 ' 'nul con conin$ conout$'.split()) for dev in devs: ntpath = to_nt(r'C:\%s.py' % dev) print(ntpath.ljust(11), '=>' ,query_link(ntpath)) output: \??\aux => \DosDevices\COM1 \??\prn => \DosDevices\LPT1 \??\com1 => object name not found \??\com9 => object name not found \??\lpt1 => \Device\Parallel0 \??\lpt9 => object name not found \??\nul => \Device\Null \??\con => \Device\ConDrv\Console \??\conin$ => \Device\ConDrv\CurrentIn \??\conout$ => \Device\ConDrv\CurrentOut The \\?\ prefix avoids DOS name translation. The only change made by the system is to replace \\?\ with \?? in the path: for dev in devs: print(to_nt(r'\\?\C:\%s.py' % dev)) output: \??\C:\aux.py \??\C:\prn.py \??\C:\com1.py \??\C:\com9.py \??\C:\lpt1.py \??\C:\lpt9.py \??\C:\nul.py \??\C:\con.py \??\C:\conin$.py \??\C:\conout$.py On this machine, \??\C: is a link to \Device\HarddiskVolume2. (to_nt and query_link call the native API functions RtlDosPathNameToNtPathName_U, NtOpenSymbolicLinkObject, and NtQuerySymbolicLinkObject. Note that Microsoft doesn't support calling the native NT API from applications in user mode.) _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com