[prev in list] [next in list] [prev in thread] [next in thread] 

List:       python-dev
Subject:    Re: [Python-Dev] PEP-8 wart... it recommends short names because of DOS
From:       eryksun <eryksun () gmail ! com>
Date:       2015-10-22 4:35:50
Message-ID: CACL+1aviA0Dx82wKEXEdv_yzExPFeeU_Qb2U8JeRecfY03=mTA () mail ! gmail ! com
[Download RAW message or body]

On 10/21/15, Serhiy Storchaka <storchaka@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/python-dev-marcsub-zyf4%40marc.info
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic