234bb31f61
The way we build python environments is subtly broken. A python environment should be semantically identical to a vanilla Python installation in, say, /usr/local. The current implementation, however, differs in two important ways. The first is that it's impossible to use python packages from the environment in python virtual environments. The second is that the nix-generated environment appears to be a venv, but it's not. This commit changes the way python environments are built: * When generating wrappers for python executables, we inherit argv[0] from the wrapper. This causes python to initialize its configuration in the environment with all the correct paths. * We remove the sitecustomize.py file from the base python package. This file was used tweak the python configuration after it was incorrectly initialized. That's no longer necessary. The end result is that python environments no longer appear to be venvs, and behave more like a vanilla python installation. In addition it's possible to create a venv using an environment and use packages from both the environment and the venv.
56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
"""
|
|
Python interpreter and environment tests.
|
|
|
|
These need to be executed with the standard library unittest.
|
|
Third party test runners such as pytest cannot be used because
|
|
that would interfere with the tests.
|
|
"""
|
|
|
|
import platform
|
|
import sys
|
|
import unittest
|
|
import site
|
|
|
|
|
|
ENV = "@env@"
|
|
INTERPRETER = "@interpreter@"
|
|
PYTHON_VERSION = "@pythonVersion@"
|
|
|
|
IS_VIRTUALENV = @is_virtualenv@
|
|
IS_VENV = @is_venv@
|
|
IS_NIXENV = @is_nixenv@
|
|
IS_PYPY = platform.python_implementation() == "PyPy"
|
|
|
|
|
|
class TestCasePython(unittest.TestCase):
|
|
|
|
@unittest.skipIf(IS_PYPY, "Executable is incorrect and needs to be fixed.")
|
|
def test_interpreter(self):
|
|
self.assertEqual(sys.executable, INTERPRETER)
|
|
|
|
@unittest.skipIf(IS_PYPY, "Prefix is incorrect and needs to be fixed.")
|
|
def test_prefix(self):
|
|
self.assertEqual(sys.prefix, ENV)
|
|
self.assertEqual(sys.prefix, sys.exec_prefix)
|
|
|
|
def test_site_prefix(self):
|
|
self.assertTrue(sys.prefix in site.PREFIXES)
|
|
|
|
@unittest.skipIf(IS_PYPY or sys.version_info.major==2, "Python 2 does not have base_prefix")
|
|
def test_base_prefix(self):
|
|
if IS_VENV or IS_VIRTUALENV:
|
|
self.assertNotEqual(sys.prefix, sys.base_prefix)
|
|
else:
|
|
self.assertEqual(sys.prefix, sys.base_prefix)
|
|
|
|
@unittest.skipIf(sys.version_info.major==3, "sys.real_prefix is only set by virtualenv in case of Python 2.")
|
|
def test_real_prefix(self):
|
|
self.assertTrue(hasattr(sys, "real_prefix") == IS_VIRTUALENV)
|
|
|
|
def test_python_version(self):
|
|
self.assertTrue(platform.python_version().startswith(PYTHON_VERSION))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|