Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2e80f85

Browse files
anntzerandrew-fennell
authored andcommitted
Tweak subprocess_run_helper.
On general grounds, an API like `subprocess_run_helper(func, *args, timeout, **extra_env)` is problematic because it prevents one from passing an environment variable called "timeout". Instead, pass the extra environment variables as a dict, without unpacking. (Technically this has been released in 3.5.2 as public API, but 1) I'm not really sure it should have been a public API to start with (should we deprecate it and make it private?), and 2) hopefully tweaking that in 3.5.3 with no deprecation is not going to disrupt anyone... I can still put in a changelog entry if that's preferred.)
1 parent b414dc8 commit 2e80f85

File tree

3 files changed

+16
-32
lines changed

3 files changed

+16
-32
lines changed

lib/matplotlib/testing/__init__.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,39 +50,28 @@ def setup():
5050
set_reproducibility_for_testing()
5151

5252

53-
def subprocess_run_helper(func, *args, timeout, **extra_env):
53+
def subprocess_run_helper(func, *args, timeout, extra_env=None):
5454
"""
55-
Run a function in a sub-process
55+
Run a function in a sub-process.
5656
5757
Parameters
5858
----------
5959
func : function
6060
The function to be run. It must be in a module that is importable.
61-
6261
*args : str
6362
Any additional command line arguments to be passed in
64-
the first argument to subprocess.run
65-
66-
**extra_env : Dict[str, str]
67-
Any additional environment variables to be set for
68-
the subprocess.
69-
63+
the first argument to ``subprocess.run``.
64+
extra_env : dict[str, str]
65+
Any additional environment variables to be set for the subprocess.
7066
"""
7167
target = func.__name__
7268
module = func.__module__
7369
proc = subprocess.run(
7470
[sys.executable,
7571
"-c",
76-
f"""
77-
from {module} import {target}
78-
{target}()
79-
""",
72+
f"from {module} import {target}; {target}()",
8073
*args],
81-
env={
82-
**os.environ,
83-
"SOURCE_DATE_EPOCH": "0",
84-
**extra_env
85-
},
74+
env={**os.environ, "SOURCE_DATE_EPOCH": "0", **(extra_env or {})},
8675
timeout=timeout, check=True,
8776
stdout=subprocess.PIPE,
8877
stderr=subprocess.PIPE,

lib/matplotlib/tests/test_backend_tk.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,8 @@ def test_func():
4848
pytest.importorskip('tkinter')
4949
try:
5050
proc = subprocess_run_helper(
51-
func, timeout=_test_timeout,
52-
MPLBACKEND="TkAgg",
53-
MPL_TEST_ESCAPE_HATCH="1"
54-
)
51+
func, timeout=_test_timeout, extra_env=dict(
52+
MPLBACKEND="TkAgg", MPL_TEST_ESCAPE_HATCH="1"))
5553
except subprocess.TimeoutExpired:
5654
pytest.fail("Subprocess timed out")
5755
except subprocess.CalledProcessError as e:

lib/matplotlib/tests/test_backends_interactive.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def test_interactive_backend(env, toolbar):
175175
proc = _run_helper(_test_interactive_impl,
176176
json.dumps({"toolbar": toolbar}),
177177
timeout=_test_timeout,
178-
**env)
178+
extra_env=env)
179179

180180
assert proc.stdout.count("CloseEvent") == 1
181181

@@ -247,8 +247,7 @@ def _test_thread_impl():
247247
@pytest.mark.parametrize("env", _thread_safe_backends)
248248
@pytest.mark.flaky(reruns=3)
249249
def test_interactive_thread_safety(env):
250-
proc = _run_helper(_test_thread_impl,
251-
timeout=_test_timeout, **env)
250+
proc = _run_helper(_test_thread_impl, timeout=_test_timeout, extra_env=env)
252251
assert proc.stdout.count("CloseEvent") == 1
253252

254253

@@ -447,7 +446,7 @@ def test_lazy_linux_headless(env):
447446
_lazy_headless,
448447
env.pop('MPLBACKEND'), env.pop("BACKEND_DEPS"),
449448
timeout=_test_timeout,
450-
**{**env, 'DISPLAY': '', 'WAYLAND_DISPLAY': ''}
449+
extra_env={**env, 'DISPLAY': '', 'WAYLAND_DISPLAY': ''}
451450
)
452451

453452

@@ -526,10 +525,8 @@ def _test_number_of_draws_script():
526525
# subprocesses can struggle to get the display, so rerun a few times
527526
@pytest.mark.flaky(reruns=4)
528527
def test_blitting_events(env):
529-
proc = _run_helper(_test_number_of_draws_script,
530-
timeout=_test_timeout,
531-
**env)
532-
528+
proc = _run_helper(
529+
_test_number_of_draws_script, timeout=_test_timeout, extra_env=env)
533530
# Count the number of draw_events we got. We could count some initial
534531
# canvas draws (which vary in number by backend), but the critical
535532
# check here is that it isn't 10 draws, which would be called if
@@ -585,8 +582,8 @@ def test_figure_leak_20490(env, time_mem):
585582
acceptable_memory_leakage += 11_000_000
586583

587584
result = _run_helper(
588-
_test_figure_leak, str(pause_time), timeout=_test_timeout, **env
589-
)
585+
_test_figure_leak, str(pause_time),
586+
timeout=_test_timeout, extra_env=env)
590587

591588
growth = int(result.stdout)
592589
assert growth <= acceptable_memory_leakage

0 commit comments

Comments
 (0)