homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Document absoluteness of sys.executable
Type: Stage: resolved
Components: Documentation Versions: Python 3.2, Python 3.3, Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: docs@python Nosy List: blarsen, dino.viehland, docs@python, eli.bendersky, eric.araujo, eric.snow, eryksun, flox, ned.deily, petri.lehtinen, pitrou, pjenvey, python-dev, ronaldoussoren, schmir, vstinner
Priority: normal Keywords: patch

Created on 2011年11月14日 16:50 by eric.araujo, last changed 2022年04月11日 14:57 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
issue13402.patch petri.lehtinen, 2011年11月20日 20:09 review
issue13402_v2.patch petri.lehtinen, 2011年12月14日 19:28 review
issue13402_v3.patch petri.lehtinen, 2012年01月31日 19:10 review
Messages (20)
msg147609 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011年11月14日 16:50
I wanted to know if sys.executable was always an absolute path but the doc does not talk about that.
(My use case is that I’d like to reload a process and I wonder if I can call os.execve or if I need to use os.execvpe.)
msg148006 - (view) Author: Petri Lehtinen (petri.lehtinen) * (Python committer) Date: 2011年11月20日 20:09
Attached a patch.
msg148029 - (view) Author: Eli Bendersky (eli.bendersky) * (Python committer) Date: 2011年11月21日 04:28
LGTM
msg148042 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011年11月21日 13:50
Patch looks good, but are you 100% sure that sys.executable is always absolute? (On all OSes, under multiprocessing, etc?)
msg148043 - (view) Author: Petri Lehtinen (petri.lehtinen) * (Python committer) Date: 2011年11月21日 14:20
Éric Araujo wrote:
> Patch looks good, but are you 100% sure that sys.executable is
> always absolute? (On all OSes, under multiprocessing, etc?)
Well, its value is computed by a function named
Py_GetProgramFullPath(), so I'm quite sure. I had a quick look on what
the function is doing, but it was quite complicated. I can check it
better if needed.
msg148317 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011年11月25日 15:00
This is the bug I was thinking about: #7774. Adding some people from that discussion to nosy.
msg148355 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2011年11月25日 19:51
LGTM too.
You could also add a test to test_sys ensuring that sys.executable is always executable.
msg148356 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011年11月25日 20:04
> You could also add a test to test_sys ensuring that sys.executable
> is always executable.
And that sys.executable is absolute?
sys.executable is an empty string if sys.argv[0] has been changed and Python is unable to retrieve the real path to the Python executable. See the issue #7774. The fact that sys.executable can be empty should be documented.
msg148357 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2011年11月25日 20:11
> > You could also add a test to test_sys ensuring that sys.executable
> > is always executable.
> 
> And that sys.executable is absolute?
Er, yes, that's what I meant. Sorry.
msg149468 - (view) Author: Petri Lehtinen (petri.lehtinen) * (Python committer) Date: 2011年12月14日 19:28
Attaching an updated patch. The documentation now says that sys.executable may be an empty string. The patch also adds a test to make sure that sys.executable is absolute.
msg149483 - (view) Author: Philip Jenvey (pjenvey) * (Python committer) Date: 2011年12月14日 23:11
sys.executable can be None on Jython (and I believe IronPython) when ran in an 'embedded' mode
msg149511 - (view) Author: Petri Lehtinen (petri.lehtinen) * (Python committer) Date: 2011年12月15日 07:09
> sys.executable can be None on Jython (and I believe IronPython) when ran in an 'embedded' mode
In CPython, embedding doesn't change the behavior.
msg150460 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012年01月02日 15:58
This discussion seems relevant: http://mail.python.org/pipermail/python-dev/2006-March/062453.html (it talks about the meaning of sys.executable, special cases such as embedded Python and functions that implement it (so we can have a look at that code)).
msg152403 - (view) Author: Petri Lehtinen (petri.lehtinen) * (Python committer) Date: 2012年01月31日 19:10
Attached one more patch. The documentation now also mentions None as a possible value.
msg152473 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2012年02月02日 19:30
New changeset fdcda5b74317 by Petri Lehtinen in branch '3.2':
Document absoluteness of sys.executable
http://hg.python.org/cpython/rev/fdcda5b74317
New changeset 8b591a86fc91 by Petri Lehtinen in branch 'default':
Merge branch 3.2
http://hg.python.org/cpython/rev/8b591a86fc91
New changeset c351536e804a by Petri Lehtinen in branch '2.7':
Document absoluteness of sys.executable
http://hg.python.org/cpython/rev/c351536e804a 
msg270210 - (view) Author: Brad Larsen (blarsen) * Date: 2016年07月11日 22:06
It looks like sys.executable is *not* always an absolute path. In Python 2.7:
 $ which python2.7
 /opt/local/bin/python2.7
 $ cd /opt/local/bin
 $ ../bin/python2.7 -m 'import sys; print(sys.executable)'
 /opt/local/bin/../bin/python2.7
Also in Python 3.5:
 $ which python3.5
 /opt/local/bin/python3.5
 $ cd /opt/local/bin
 $ ../bin/python3.5 -m 'import sys; print(sys.executable)'
 /opt/local/bin/../bin/python3.5
msg270217 - (view) Author: Eryk Sun (eryksun) * (Python triager) Date: 2016年07月12日 00:35
"/opt/local/bin/../bin/python2.7" is an absolute path. 
 >>> os.path.isabs('/opt/local/bin/../bin/python2.7')
 True
It's not relative to the working directory.
msg270222 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2016年07月12日 02:39
@blarsen, and there's something strange about your example. '-m' won't work with a real python executable, presumably you meant '-c'. And judging from the paths involved, I'm guessing you are using MacPorts on OS X. With either MacPorts or any other OS X framework build, you wouldn't see results like that with -c.
 ../bin/python3.5 -c 'import sys; print(sys.executable)'
/opt/local/bin/python3.5
../bin/python2.7 -c 'import sys; print(sys.executable)'
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
So I'm guessing what's in ../bin/python3.7 and ../bin/python3.5 is something other than the normal python bootstrap binaries.
msg270223 - (view) Author: Brad Larsen (blarsen) * Date: 2016年07月12日 02:59
@eryksun, you are right! The output *is* an absolute path as far as `os.path.isabs` is concerned.
@ned.deily, you are right about my example --- I transcribed it wrong, and it should be `-c`.
The system in question is not a Mac OS system, but a Linux system with newer Python versions than what come with the system installed to /opt/local. These are compiled from source, but without any modifications.
I'm commenting here because I'm seeing the `test_sys` test from the regression suite fail in a slightly modified version of Python that ships with a product. In particular, in Lib/test/test_sys.py around line 640, we have this:
 @unittest.skipIf(sys.base_prefix != sys.prefix,
 'Test is not venv-compatible')
 def test_executable(self):
 # sys.executable should be absolute
 self.assertEqual(os.path.abspath(sys.executable), sys.executable)
Yes, /opt/local/bin/../bin/python3.5 is an absolute path as far as `os.path.isabs` is concerned, but `os.path.abspath('/opt/local/bin/../bin/python3.5')` gives '/opt/local/bin/python3.5', and the test fails. So maybe the documentation is fine but the test is wrong?
msg270224 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2016年07月12日 03:05
@blarsen, OK, but if you want to pursue this, please open a new issue against the current versions. This issue was closed years ago and against earlier versions so your comments will not get acted on.
History
Date User Action Args
2022年04月11日 14:57:23adminsetgithub: 57611
2016年07月12日 03:05:43ned.deilysetmessages: + msg270224
2016年07月12日 02:59:08blarsensetmessages: + msg270223
2016年07月12日 02:39:28ned.deilysetnosy: + ned.deily
messages: + msg270222
2016年07月12日 00:35:28eryksunsetnosy: + eryksun
messages: + msg270217
2016年07月11日 22:06:12blarsensetnosy: + blarsen
messages: + msg270210
2012年02月02日 19:30:22python-devsetstatus: open -> closed

nosy: + python-dev
messages: + msg152473

resolution: fixed
stage: resolved
2012年01月31日 19:10:36petri.lehtinensetfiles: + issue13402_v3.patch

messages: + msg152403
2012年01月02日 15:58:34eric.araujosetmessages: + msg150460
2011年12月15日 07:09:33petri.lehtinensetmessages: + msg149511
2011年12月14日 23:11:28pjenveysetnosy: + pjenvey, dino.viehland
messages: + msg149483
2011年12月14日 19:28:54petri.lehtinensetfiles: + issue13402_v2.patch

messages: + msg149468
2011年11月25日 20:11:41pitrousetmessages: + msg148357
2011年11月25日 20:04:24vstinnersetmessages: + msg148356
2011年11月25日 19:51:31pitrousetmessages: + msg148355
2011年11月25日 15:00:07eric.araujosetnosy: + ronaldoussoren, pitrou, vstinner, schmir, flox
messages: + msg148317
2011年11月21日 20:08:03eric.snowsetnosy: + eric.snow
2011年11月21日 14:20:04petri.lehtinensetmessages: + msg148043
2011年11月21日 13:50:02eric.araujosetmessages: + msg148042
2011年11月21日 04:28:26eli.benderskysetnosy: + eli.bendersky
messages: + msg148029
2011年11月20日 20:09:07petri.lehtinensetfiles: + issue13402.patch
keywords: + patch
messages: + msg148006
2011年11月19日 10:50:21petri.lehtinensetnosy: + petri.lehtinen
2011年11月14日 16:50:37eric.araujocreate

AltStyle によって変換されたページ (->オリジナル) /