[issue24793] Calling 'python' via subprocess.call ignoring passed %PATH%

2015-08-05 Thread eryksun

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 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24793] Calling 'python' via subprocess.call ignoring passed %PATH%

2015-08-05 Thread Paul Moore

Paul Moore added the comment:

This is standard Windows behaviour. Executables are always located first in the 
directory where your program (in this case the Python executable) is running 
from - even before searching PATH.

If you want to use a different Python, you should specify the full path  to the 
executable - "subprocess.call(["C:\\Python34\\python.exe"])".

--
resolution:  -> not a bug
status: open -> closed

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue24793] Calling 'python' via subprocess.call ignoring passed %PATH%

2015-08-05 Thread Gregor

New submission from Gregor:

I just noticed that there is a litte inconvenience when I try to invoke 
'python' via subprocess.call passing an environment (%PATH%) from a script. I 
pass an environment where %PATH% only contains one directory where a 
python2.7.3-exe is present (I checked with 
"subprocess.call(['where','python'],env=environment)" that python is found 
there). However when calling "subprocess.call(['python'],env=environment)" 
python 2.7.9 is opened, which is the python version I called the script with. 
Seems inconvenient to me.

Greetings

--
components: Windows
messages: 248023
nosy: paul.moore, phbarnacle, steve.dower, tim.golden, zach.ware
priority: normal
severity: normal
status: open
title: Calling 'python' via subprocess.call ignoring passed %PATH%
type: behavior
versions: Python 2.7

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com