Skip to content

Commit 95aaaec

Browse files
authored
Merge pull request #388 from blueyed/pass-mainargv
Pass and use original sys.argv to/with workers
2 parents 33d5441 + a70dace commit 95aaaec

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed

changelog/388.feature.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
``mainargv`` is made available in ``workerinput`` from the host's ``sys.argv``.
2+
3+
This can be used via ``request.config.workerinput["mainargv"]``.

testing/test_remote.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import os
12
import py
23
import pprint
34
import pytest
5+
import sys
46

57
from xdist.workermanage import WorkerController, unserialize_report
68
from xdist.remote import serialize_report
@@ -397,3 +399,68 @@ def test():
397399
)
398400
result = testdir.runpytest("-n2", "--max-worker-restart=0")
399401
assert result.ret == 0
402+
403+
404+
def test_remote_inner_argv(testdir):
405+
"""Test/document the behavior due to execnet using `python -c`."""
406+
testdir.makepyfile(
407+
"""
408+
import sys
409+
410+
def test_argv():
411+
assert sys.argv == ["-c"]
412+
"""
413+
)
414+
result = testdir.runpytest("-n1")
415+
assert result.ret == 0
416+
417+
418+
def test_remote_mainargv(testdir):
419+
outer_argv = sys.argv
420+
421+
testdir.makepyfile(
422+
"""
423+
def test_mainargv(request):
424+
assert request.config.workerinput["mainargv"] == {!r}
425+
""".format(
426+
outer_argv
427+
)
428+
)
429+
result = testdir.runpytest("-n1")
430+
assert result.ret == 0
431+
432+
433+
def test_remote_usage_prog(testdir, request):
434+
if not hasattr(request.config._parser, "prog"):
435+
pytest.skip("prog not available in config parser")
436+
prog = os.path.basename(sys.argv[0])
437+
438+
testdir.makeconftest(
439+
"""
440+
import pytest
441+
442+
config_parser = None
443+
444+
@pytest.fixture
445+
def get_config_parser():
446+
return config_parser
447+
448+
def pytest_configure(config):
449+
global config_parser
450+
config_parser = config._parser
451+
"""
452+
)
453+
testdir.makepyfile(
454+
"""
455+
import sys
456+
457+
def test(get_config_parser, request):
458+
get_config_parser._getparser().error("my_usage_error")
459+
"""
460+
)
461+
462+
result = testdir.runpytest_subprocess("-n1")
463+
assert result.ret == 1
464+
result.stdout.fnmatch_lines(
465+
["usage: %s *" % prog, "%s: error: my_usage_error" % prog]
466+
)

xdist/remote.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ def remote_initconfig(option_dict, args):
264264
import py
265265

266266
config = remote_initconfig(option_dict, args)
267+
config._parser.prog = os.path.basename(workerinput["mainargv"][0])
267268
config.workerinput = workerinput
268269
config.workeroutput = {}
269270
# TODO: deprecated name, backward compatibility only. Remove it in future

xdist/workermanage.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import fnmatch
33
import os
44
import re
5+
import sys
56
import threading
67

78
import py
@@ -213,6 +214,7 @@ def __init__(self, nodemanager, gateway, config, putevent):
213214
"workercount": len(nodemanager.specs),
214215
"slaveid": gateway.id,
215216
"slavecount": len(nodemanager.specs),
217+
"mainargv": sys.argv,
216218
}
217219
# TODO: deprecated name, backward compatibility only. Remove it in future
218220
self.slaveinput = self.workerinput

0 commit comments

Comments
 (0)