Repository: pytest-dev/pytest-xdist

Issue:
xdist adds current directory to sys.path
With 1.26.1.
```python
import sys

def test_path():
    assert "" not in sys.path
```
```
$ pytest test_path.py
<OK>
$ pytest test_path.py -n 1
E     AssertionError....
```
Obviously this can cause problems/change behaviour depending on where you are running the tests from.

Possibly related to #376?

Discussion:

Patch:
diff --git a/changelog/421.bugfix.rst b/changelog/421.bugfix.rst
new file mode 100644
index 0000000..121c69c
--- /dev/null
+++ b/changelog/421.bugfix.rst
@@ -0,0 +1,1 @@
+Copy the parent process sys.path into local workers, to work around execnet's python -c adding the current directory to sys.path.
diff --git a/src/xdist/plugin.py b/src/xdist/plugin.py
index 1eba32b..d569386 100644
--- a/src/xdist/plugin.py
+++ b/src/xdist/plugin.py
@@ -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:
diff --git a/src/xdist/remote.py b/src/xdist/remote.py
index 7f95b5c..d79f0b3 100644
--- a/src/xdist/remote.py
+++ b/src/xdist/remote.py
@@ -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"]
diff --git a/src/xdist/workermanage.py b/src/xdist/workermanage.py
index 8fed077..2c4f1a6 100644
--- a/src/xdist/workermanage.py
+++ b/src/xdist/workermanage.py
@@ -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:


Test patch:
diff --git a/testing/test_remote.py b/testing/test_remote.py
index 2f6e222..31a6a2a 100644
--- a/testing/test_remote.py
+++ b/testing/test_remote.py
@@ -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):
+    """Work around sys.path differences 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