Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/akernel/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,11 @@ def __init__(
def init_kernel(self):
if self.kernel_initialized:
return
# Console-script launchers put their bin directory on sys.path.
# Resolve local imports against the current working directory, including
# after user code changes it.
if "" not in sys.path:
sys.path.insert(0, "")
self.globals = {"print": self.print, "_": None}
if self.execute_in_thread:
self.globals["input"] = self.input
Expand Down
23 changes: 23 additions & 0 deletions tests/test_startup.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,37 @@
import sys
from types import SimpleNamespace

import pytest
from anyio import create_memory_object_stream, create_task_group, fail_after

from akernel.execution import compile_cell, execute_cell
from akernel.kernel import Kernel
from akernel.message import create_message, deserialize, feed_identities, serialize

pytestmark = pytest.mark.anyio


async def test_local_imports_follow_working_directory(tmp_path, monkeypatch):
# Reproduce a console-script launch without the working directory on sys.path.
monkeypatch.setattr(sys, "path", [path for path in sys.path if path != ""])
kernel = Kernel(*([None] * 7))
kernel.init_kernel()
for index in range(2):
directory = tmp_path / str(index)
package = directory / f"local_package_{index}"
package.mkdir(parents=True)
(package / "foo.py").write_text(f"bar = {index}\n")
monkeypatch.chdir(directory)
try:
result = await execute_cell(
compile_cell(f"from local_package_{index}.foo import bar\nbar"), kernel.globals
)
assert result == index
finally:
sys.modules.pop(f"local_package_{index}.foo", None)
sys.modules.pop(f"local_package_{index}", None)


class TestStartup:
@pytest.fixture(autouse=True)
async def kernel_fixture(self, anyio_backend):
Expand Down
Loading