Skip to content

Commit

Permalink
python_selector checks if found python command is valid (#275)
Browse files Browse the repository at this point in the history
Addresses emscripten-core/emscripten#8792

I've found what's the reason of the strange behaviour of last changes (#273).

In order to reproduce this problem it's needed:

    To don't have python3 installed in system
    To have pyenv with installed at least one version from each family, like:

pyenv install 3.7.0
pyenv install 2.7.15

    To activate a version from python2

pyenv local 2.7.15

Then we have a strange situation that python3 is available as a command, but it's just a mock for pyenv:

➜ pyenv versions
  system
* 2.7.15 (set by /home/trzeci/Projects/emsdk/.python-version)
  3.7.0

➜ which python3
~/.pyenv/shims/python3

➜ python3 --version
pyenv: python3: command not found

The `python3' command exists in these Python versions:
  3.7.0

➜ ./emsdk --help        
pyenv: python3: command not found

The `python3' command exists in these Python versions:
  3.7.0

As you see in an example above I didn't even call emsdk script, just tried to execute python3 --version and I've got exactly the same error. The problem of pyenv is that even if python3 isn't active it's available in the system PATH.
Calling ./emsdk --help get's the same error, as python3 was used.

At the moment this entirely breaks logic in python_selector and in pyenv working command is indistinguishable from stub python command.

@kripken: A couple of ways to go from here:

    revert logic of python_selector and advertise mac users to use python3
    keep logic and advertise pyenv users to use python3
    This PR: extend logic of python_selector by checking if found python command is valid (for the instance by calling python --version), this will filter out false positive matches that coming from pyenv

After patch:

➜ pyenv versions        
  system
* 2.7.15 (set by /home/trzeci/Projects/emsdk/.python-version)
  3.7.0

➜ which python3 
~/.pyenv/shims/python3

➜ python3 --version
pyenv: python3: command not found

The `python3' command exists in these Python versions:
  3.7.0


➜ ./emsdk --help
 emsdk: Available commands:

   emsdk list [--old] [--uses]  - Lists all available SDKs and tools and their
                                  current installation status. With the --old
   ....

As you can see python3 --version command fails as it was, but that's expected behaviour. What's important is that ./emsdk --help gets executed as python_selector recognizes a stub.
  • Loading branch information
trzecieu authored and kripken committed Jun 13, 2019
1 parent a61a528 commit 29b91e3
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion python_selector
Expand Up @@ -16,7 +16,12 @@ def which(program):
for path in [""] + os.environ.get("PATH", "").split(os.pathsep):
exe_file = os.path.join(path, program)
if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):
return exe_file
# in case of pyenv we might have `python3` command available, but it's just a stub
# https://github.com/emscripten-core/emscripten/issues/8792
p = subprocess.Popen([exe_file, "--version"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
if p.returncode == 0:
return exe_file
return None

# Look for the best choice for python, favours Python3 over Python2
Expand Down

0 comments on commit 29b91e3

Please sign in to comment.