Eryk Sun <eryk...@gmail.com> added the comment:

> and it happens that "pkg" is found in a folder that is 
> given in sys.path as a relative path

I'd prefer that Python disallowed relative paths in sys.path [1]. But since 
they're allowed, I think importlib at least could try to resolve relative paths 
in a copy of sys.path before searching. 

> as of 3.8 the current directory is removed from the search path, 
> so the .pyd is never found

It happens to work prior to 3.8 even though the load uses the flag 
LOAD_WITH_ALTERED_SEARCH_PATH, for which it's documented that "[i]f this value 
is used and lpFileName specifies a relative path, the behavior is undefined". 

The implemented behavior with LOAD_WITH_ALTERED_SEARCH_PATH is that the 
directory of the given DLL filename is added to the head of the DLL search 
path, even though it's a relative path. Then the DLL filename is searched for 
like any other relative filename. 

For example, loading r"foo\spam.pyd" will try to load r"foo\foo\spam.pyd" (note 
the double "foo"), r"C:\Windows\System32\foo\spam.pyd", 
r"C:\Windows\System\foo\spam.pyd", r"C:\Windows\foo\spam.pyd", and so on. If 
the current working directory (i.e. ".") is in the DLL search path, and 
r"foo\spam.pyd" isn't accidentally found relative to a directory that's 
searched before ".", then the loader will find r".\foo\spam.pyd". Fortunately 
another thread can't change the working directory while the loader is 
searching, since the PEB lock is held. If r"foo\spam.pyd" is found and it 
depends on "eggs.dll", the loader will look for it first in the DLL directory, 
i.e. as r"foo\eggs.dll".

The implicit inclusion of the working directory can be disabled or replaced 
with another directory via SetDllDirectoryW(), in which case the working 
directory will only be checked if %PATH% contains a "." entry. If it's replaced 
with another directory, then it's even inheritable from a SetDllDirectoryW() 
call in an ancestor process.

3.8+ uses the flag LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR, which requires the DLL 
filename to be a fully-qualified path.

---
[1] That includes the "" entry in sys.path in the interactive shell. I wish it 
was implemented to resolve the working directory at startup instead of letting 
the entry vary with the current working directory.

----------
nosy: +brett.cannon, eryksun

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

Reply via email to