New submission from Oren Held <o...@held.org.il>:

A. Description
When running os._execvpe with a relative pathname that does not exist, I'd 
expect to get ENOENT error. But there is an edge case in which Python throws 
ENOTDIR error - when the LAST element in PATH is a regular file (e.g. /bin/ls). 
This case is caused by a sysadmin mistake, but it may happen, as in the system 
on which I've encountered this bug.

B. Explanation + How to reproduce:
Consider the following case:
PATH="/bin:/bin/ls" # Last part is a filename instead of a directory
>>> import os; os.execvp("blabla", [""])
Throws: OSError: [Errno 20] Not a directory

Now, consider a similar but differently-ordered PATH:
PATH="/bin/ls:/bin" # *First* part is a filename instead of a directory
>>> import os; os.execvp("blabla", [""])
Throws: OSError: [Errno 2] No such file or directory


C. Why this behavior is not good:
First, IMO there is a certain problem here - differently ordered PATH shouldn't 
throw different exception. In both cases the executable was not found in PATH, 
both cases are the same for this matter.

Second, the unix shell (e.g. bash) faces the same issue, and behaves 
differently. It'll return "command not found" to stdout for both ENOENT and 
ENOTDIR cases, regardless of the element order in PATH.


D. My recommendation
I'd recommend throwing ENOENT even when ENODIR is thrown for some paths. I am 
not sure what's the least-evil way to do it, I've been thinking of the 
following patch, but it's not working because it depends on strerror. It also 
looks kinda ugly:

--- os.py.old   2010-05-02 17:41:21.481909804 +0300
+++ os.py       2010-05-02 18:03:11.261872651 +0300
@@ -386,7 +386,7 @@
                 saved_tb = tb
     if saved_exc:
         raise error, saved_exc, saved_tb
-    raise error, e, tb
+    raise error, error(errno.ENOENT, os.strerror(errno.ENOENT)), tb # DOESNT 
WORK, no access to os.strerror from here
 
 # Change environ to automatically call putenv() if it exists
 try:

----------
components: Library (Lib)
messages: 104788
nosy: Oren_Held
priority: normal
severity: normal
status: open
title: _execvpe should behaves inconsistently when PATH includes a filename
type: behavior
versions: Python 2.6

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

Reply via email to