Merge pull request #264 from YannickJadoul/check-python-path

Checking python in PATH is the one `cibuildwheel` installed/expects
This commit is contained in:
Yannick Jadoul
2020-02-20 12:10:37 +01:00
committed by GitHub
4 changed files with 54 additions and 9 deletions
+21 -8
View File
@@ -63,17 +63,30 @@ def build(project_dir, output_dir, test_command, test_requires, test_extras, bef
mkdir /output mkdir /output
cd /project cd /project
{environment_exports} for PYBIN in {pybin_paths}; do (
# Temporary hack/workaround, putting loop body in subshell; fixed in PR #256
export PATH="$PYBIN:$PATH"
{environment_exports}
# check the active python and pip are in PYBIN
if [ "$(which pip)" != "$PYBIN/pip" ]; then
echo "cibuildwheel: python available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it."
exit 1
fi
if [ "$(which python)" != "$PYBIN/python" ]; then
echo "cibuildwheel: pip available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert pip above it."
exit 1
fi
for PYBIN in {pybin_paths}; do
if [ ! -z {before_build} ]; then if [ ! -z {before_build} ]; then
PATH="$PYBIN:$PATH" sh -c {before_build} sh -c {before_build}
fi fi
# Build the wheel # Build the wheel
rm -rf /tmp/built_wheel rm -rf /tmp/built_wheel
mkdir /tmp/built_wheel mkdir /tmp/built_wheel
PATH="$PYBIN:$PATH" "$PYBIN/pip" wheel . -w /tmp/built_wheel --no-deps {build_verbosity_flag} pip wheel . -w /tmp/built_wheel --no-deps {build_verbosity_flag}
built_wheel=(/tmp/built_wheel/*.whl) built_wheel=(/tmp/built_wheel/*.whl)
# repair the wheel # repair the wheel
@@ -92,9 +105,9 @@ def build(project_dir, output_dir, test_command, test_requires, test_extras, bef
if [ ! -z {test_command} ]; then if [ ! -z {test_command} ]; then
# Set up a virtual environment to install and test from, to make sure # Set up a virtual environment to install and test from, to make sure
# there are no dependencies that were pulled in at build time. # there are no dependencies that were pulled in at build time.
"$PYBIN/pip" install virtualenv pip install virtualenv
venv_dir=`mktemp -d`/venv venv_dir=`mktemp -d`/venv
"$PYBIN/python" -m virtualenv "$venv_dir" python -m virtualenv "$venv_dir"
# run the tests in a subshell to keep that `activate` # run the tests in a subshell to keep that `activate`
# script from polluting the env # script from polluting the env
@@ -123,7 +136,7 @@ def build(project_dir, output_dir, test_command, test_requires, test_extras, bef
) )
# exit if tests failed (needed for older bash versions) # exit if tests failed (needed for older bash versions)
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
exit 1; exit 1;
fi fi
# clean up # clean up
@@ -133,7 +146,7 @@ def build(project_dir, output_dir, test_command, test_requires, test_extras, bef
# we're all done here; move it to output # we're all done here; move it to output
mv "${{repaired_wheels[@]}}" /output mv "${{repaired_wheels[@]}}" /output
for repaired_wheel in "${{repaired_wheels[@]}}"; do chown {uid}:{gid} "/output/$(basename "$repaired_wheel")"; done for repaired_wheel in "${{repaired_wheels[@]}}"; do chown {uid}:{gid} "/output/$(basename "$repaired_wheel")"; done
done ) done
'''.format( '''.format(
pybin_paths=' '.join(c.path + '/bin' for c in platform_configs), pybin_paths=' '.join(c.path + '/bin' for c in platform_configs),
test_requires=' '.join(test_requires), test_requires=' '.join(test_requires),
+10
View File
@@ -2,6 +2,7 @@ import os
import shlex import shlex
import shutil import shutil
import subprocess import subprocess
import sys
import tempfile import tempfile
from collections import namedtuple from collections import namedtuple
from glob import glob from glob import glob
@@ -137,11 +138,20 @@ def build(project_dir, output_dir, test_command, test_requires, test_extras, bef
# check what version we're on # check what version we're on
call(['which', 'python'], env=env) call(['which', 'python'], env=env)
call(['python', '--version'], env=env) call(['python', '--version'], env=env)
which_python = subprocess.check_output(['which', 'python'], env=env, universal_newlines=True).strip()
if which_python != '/tmp/cibw_bin/python':
print("cibuildwheel: python available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it.", file=sys.stderr)
exit(1)
# install pip & wheel # install pip & wheel
call(['python', get_pip_script], env=env, cwd="/tmp") call(['python', get_pip_script], env=env, cwd="/tmp")
assert os.path.exists(os.path.join(installation_bin_path, 'pip')) assert os.path.exists(os.path.join(installation_bin_path, 'pip'))
call(['which', 'pip'], env=env)
call(['pip', '--version'], env=env) call(['pip', '--version'], env=env)
which_pip = subprocess.check_output(['which', 'pip'], env=env, universal_newlines=True).strip()
if which_pip != '/tmp/cibw_bin/pip':
print("cibuildwheel: pip available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert pip above it.", file=sys.stderr)
exit(1)
call(['pip', 'install', '--upgrade', 'setuptools', 'wheel', 'delocate'], env=env) call(['pip', 'install', '--upgrade', 'setuptools', 'wheel', 'delocate'], env=env)
# setup target platform, only required for python 3.5 # setup target platform, only required for python 3.5
+9
View File
@@ -1,6 +1,7 @@
import os import os
import shutil import shutil
import subprocess import subprocess
import sys
import tempfile import tempfile
from collections import namedtuple from collections import namedtuple
from glob import glob from glob import glob
@@ -141,11 +142,19 @@ def build(project_dir, output_dir, test_command, test_requires, test_extras, bef
simple_shell(['where', 'python'], env=env) simple_shell(['where', 'python'], env=env)
simple_shell(['python', '--version'], env=env) simple_shell(['python', '--version'], env=env)
simple_shell(['python', '-c', '"import struct; print(struct.calcsize(\'P\') * 8)"'], env=env) simple_shell(['python', '-c', '"import struct; print(struct.calcsize(\'P\') * 8)"'], env=env)
where_python = subprocess.check_output(['where', 'python'], env=env, universal_newlines=True).splitlines()[0].strip()
if where_python != os.path.join(installation_path, 'python.exe'):
print("cibuildwheel: python available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert python above it.", file=sys.stderr)
exit(1)
# make sure pip is installed # make sure pip is installed
if not os.path.exists(os.path.join(installation_path, 'Scripts', 'pip.exe')): if not os.path.exists(os.path.join(installation_path, 'Scripts', 'pip.exe')):
simple_shell(['python', get_pip_script], env=env, cwd="C:\\cibw") simple_shell(['python', get_pip_script], env=env, cwd="C:\\cibw")
assert os.path.exists(os.path.join(installation_path, 'Scripts', 'pip.exe')) assert os.path.exists(os.path.join(installation_path, 'Scripts', 'pip.exe'))
where_pip = subprocess.check_output(['where', 'pip'], env=env, universal_newlines=True).splitlines()[0].strip()
if where_pip.strip() != os.path.join(installation_path, 'Scripts', 'pip.exe'):
print("cibuildwheel: pip available on PATH doesn't match our installed instance. If you have modified PATH, ensure that you don't overwrite cibuildwheel's entry or insert pip above it.", file=sys.stderr)
exit(1)
# prepare the Python environment # prepare the Python environment
simple_shell(['python', '-m', 'pip', 'install', '--upgrade', 'pip'], env=env) simple_shell(['python', '-m', 'pip', 'install', '--upgrade', 'pip'], env=env)
+14 -1
View File
@@ -1,5 +1,6 @@
import os import os
import pytest
import subprocess
import utils import utils
@@ -17,3 +18,15 @@ def test():
# also check that we got the right wheels built # also check that we got the right wheels built
expected_wheels = utils.expected_wheels('spam', '0.1.0') expected_wheels = utils.expected_wheels('spam', '0.1.0')
assert set(actual_wheels) == set(expected_wheels) assert set(actual_wheels) == set(expected_wheels)
def test_overridden_path(tmp_path):
project_dir = os.path.dirname(__file__)
# mess up PATH, somehow
with pytest.raises(subprocess.CalledProcessError):
utils.cibuildwheel_run(project_dir, output_dir=tmp_path, add_env={
'CIBW_ENVIRONMENT': '''SOMETHING="$(mkdir new_path && touch new_path/python)" PATH="$(realpath new_path):$PATH"''',
'CIBW_ENVIRONMENT_WINDOWS': '''SOMETHING="$(mkdir new_path && type nul > new_path/python.exe)" PATH="$CD\\new_path;$PATH"''',
})
assert len(os.listdir(str(tmp_path))) == 0