From bfd708404862d0f9672e53502736ebbb66a2bc0c Mon Sep 17 00:00:00 2001 From: Bernat Gabor Date: Thu, 16 Apr 2020 13:01:34 +0100 Subject: [PATCH] Setuptools compatibility with cli_run Signed-off-by: Bernat Gabor --- docs/changelog/1771.bugfix.rst | 2 ++ src/virtualenv/discovery/py_info.py | 5 +++-- tests/unit/test_run.py | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/1771.bugfix.rst diff --git a/docs/changelog/1771.bugfix.rst b/docs/changelog/1771.bugfix.rst new file mode 100644 index 000000000..1f92b63e5 --- /dev/null +++ b/docs/changelog/1771.bugfix.rst @@ -0,0 +1,2 @@ +Importing setuptools before cli_run could cause our python information query to fail due to setuptools patching +``distutils.dist.Distribution`` - by :user:`gaborbernat`. diff --git a/src/virtualenv/discovery/py_info.py b/src/virtualenv/discovery/py_info.py index d41c99cf6..6d76cbed7 100644 --- a/src/virtualenv/discovery/py_info.py +++ b/src/virtualenv/discovery/py_info.py @@ -13,8 +13,8 @@ import sys import sysconfig from collections import OrderedDict, namedtuple +from distutils import dist from distutils.command.install import SCHEME_KEYS -from distutils.dist import Distribution from string import digits VersionInfo = namedtuple("VersionInfo", ["major", "minor", "micro", "releaselevel", "serial"]) @@ -110,7 +110,8 @@ def _fast_get_system_executable(self): @staticmethod def _distutils_install(): # follow https://github.com/pypa/pip/blob/master/src/pip/_internal/locations.py#L95 - d = Distribution({"script_args": "--no-user-cfg"}) # configuration files not parsed so they do not hijack paths + # note here we don't import Distribution directly to allow setuptools to patch it + d = dist.Distribution({"script_args": "--no-user-cfg"}) # conf files not parsed so they do not hijack paths if hasattr(sys, "_framework"): sys._framework = None # disable macOS static paths for framework i = d.get_command_obj("install", create=True) diff --git a/tests/unit/test_run.py b/tests/unit/test_run.py index 436e5eba6..839886c0e 100644 --- a/tests/unit/test_run.py +++ b/tests/unit/test_run.py @@ -1,5 +1,8 @@ from __future__ import absolute_import, unicode_literals +import subprocess +import sys + import pytest import six @@ -31,3 +34,16 @@ def test_version(capsys): import virtualenv assert virtualenv.__file__ in content + + +def test_cli_run_setuptools_compatible(capfd, tmp_path): + subprocess.check_call( + [ + sys.executable, + "-c", + "from setuptools import find_packages;" "from virtualenv import cli_run; cli_run([r'{}'])".format(tmp_path), + ] + ) + out, err = capfd.readouterr() + assert out + assert not err