fix sys.path for local workers Fixes #421
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
import os
|
||||
import uuid
|
||||
import sys
|
||||
|
||||
import py
|
||||
import pytest
|
||||
|
||||
_sys_path = list(sys.path) # freeze a copy of sys.path at interpreter startup
|
||||
|
||||
|
||||
def pytest_xdist_auto_num_workers():
|
||||
try:
|
||||
|
||||
@@ -219,12 +219,14 @@ if __name__ == "__channelexec__":
|
||||
channel = channel # noqa
|
||||
workerinput, args, option_dict, change_sys_path = channel.receive()
|
||||
|
||||
if change_sys_path:
|
||||
if change_sys_path is None:
|
||||
importpath = os.getcwd()
|
||||
sys.path.insert(0, importpath)
|
||||
os.environ["PYTHONPATH"] = (
|
||||
importpath + os.pathsep + os.environ.get("PYTHONPATH", "")
|
||||
)
|
||||
else:
|
||||
sys.path = change_sys_path
|
||||
|
||||
os.environ["PYTEST_XDIST_TESTRUNUID"] = workerinput["testrunuid"]
|
||||
os.environ["PYTEST_XDIST_WORKER"] = workerinput["workerid"]
|
||||
|
||||
@@ -9,6 +9,7 @@ import pytest
|
||||
import execnet
|
||||
|
||||
import xdist.remote
|
||||
from xdist.plugin import _sys_path
|
||||
|
||||
|
||||
def parse_spec_config(config):
|
||||
@@ -261,7 +262,8 @@ class WorkerController:
|
||||
remote_module = self.config.hook.pytest_xdist_getremotemodule()
|
||||
self.channel = self.gateway.remote_exec(remote_module)
|
||||
# change sys.path only for remote workers
|
||||
change_sys_path = not self.gateway.spec.popen
|
||||
# restore sys.path from a frozen copy for local workers
|
||||
change_sys_path = _sys_path if self.gateway.spec.popen else None
|
||||
self.channel.send((self.workerinput, args, option_dict, change_sys_path))
|
||||
|
||||
if self.putevent:
|
||||
|
||||
@@ -234,7 +234,7 @@ def test_remote_env_vars(testdir):
|
||||
|
||||
|
||||
def test_remote_inner_argv(testdir):
|
||||
"""Test/document the behavior due to execnet using `python -c`."""
|
||||
"""Work around sys.path differences due to execnet using `python -c`."""
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
import sys
|
||||
@@ -292,3 +292,17 @@ def test_remote_usage_prog(testdir, request):
|
||||
result = testdir.runpytest_subprocess("-n1")
|
||||
assert result.ret == 1
|
||||
result.stdout.fnmatch_lines(["*usage: *", "*error: my_usage_error"])
|
||||
|
||||
|
||||
def test_remote_sys_path(testdir):
|
||||
"""Test/document the behavior due to execnet using `python -c`."""
|
||||
testdir.makepyfile(
|
||||
"""
|
||||
import sys
|
||||
|
||||
def test_sys_path():
|
||||
assert "" not in sys.path
|
||||
"""
|
||||
)
|
||||
result = testdir.runpytest("-n1")
|
||||
assert result.ret == 0
|
||||
|
||||
Reference in New Issue
Block a user