eryksun added the comment:

Popen calls Windows [CreateProcess][1]. If the Popen "executable" argument 
isn't used or if the file from the command line doesn't include a directory 
path, then CreateProcess searches for it in the following directories:

    1. The directory from which the application loaded.
    2. The current directory for the parent process.
       * This step is skipped if the parent defines
         %NoDefaultCurrentDirectoryInExePath%.
    3. The 32-bit Windows system directory.
    4. The 16-bit Windows system directory. 
    5. The Windows directory. 
    6. The directories that are listed in the PATH 
       environment variable. 

Also note that the PATH searched is that of the *parent* process; the "env" 
parameter doesn't affect this. 

Call the SearchPath function if you need a custom search for the fully 
qualified path. 

    import ctypes
    from ctypes import wintypes

    kernel32 = ctypes.WinDLL('kernel32')

    kernel32.SearchPathW.argtypes = (
        wintypes.LPCWSTR,                   # _In_opt_  lpPath
        wintypes.LPCWSTR,                   # _In_      lpFileName
        wintypes.LPCWSTR,                   # _In_opt_  lpExtension
        wintypes.DWORD,                     # _In_      nBufferLength
        wintypes.LPWSTR,                    # _Out_     lpBuffer
        ctypes.POINTER(wintypes.LPWSTR))    # _Out_opt_ lpFilePart
                                            
    def search_path(filename, path=None, ext='.exe'):
        length, new_length = 0, 260
        while new_length > length:
            length = new_length
            filepath = (ctypes.c_wchar * length)()
            new_length = kernel32.SearchPathW(path, filename, ext,
                                              length, filepath, None)
        return filepath.value

For example:

    >>> search_path('python')
    u'C:\\Program Files\\Python27\\python.exe'
    >>> import os            
    >>> search_path('python', os.environ['PATH'])
    u''

    >>> search_path('more.com', os.environ['PATH'])
    u'C:\\Windows\\System32\\more.com'
    >>> search_path('more', ext='.com')            
    u'C:\\Windows\\system32\\more.com'

[1]: https://msdn.microsoft.com/en-us/library/ms682425

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue24793>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to