def clean_kernel_spec(user=True, prefix=None):
    mgr = KernelSpecManager()
    # NOTE: remove_kernel_spec() and get_all_specs() does not support explicit prefix.
    #       Sometimes we may need to perform --clean-only multiple times to completely
    #       remove all kernelspecs installed around venvs and system global directories.
    for name, info in mgr.get_all_specs().items():
        if name.startswith('backend'):
            print("Removing existing Backend.AI kernel: {0}"
                  .format(info['spec']['display_name']))
            mgr.remove_kernel_spec(name)
Exemple #2
0
def _jupyter_kernel(args):
    """Make xonsh available as a Jupyter kernel."""
    try:
        from jupyter_client.kernelspec import KernelSpecManager, NoSuchKernel
    except ImportError as e:
        raise ImportError(
            "Jupyter not found in current Python environment") from e

    ksm = KernelSpecManager()

    root = args.root
    prefix = args.prefix if args.prefix else sys.prefix
    user = args.user
    spec = {
        "argv": [
            sys.executable,
            "-m",
            "xonsh.jupyter_kernel",
            "-f",
            "{connection_file}",
        ],
        "display_name":
        "Xonsh",
        "language":
        "xonsh",
        "codemirror_mode":
        "shell",
    }

    if root and prefix:
        # os.path.join isn't used since prefix is probably absolute
        prefix = root + prefix

    try:
        old_jup_kernel = ksm.get_kernel_spec(XONSH_JUPYTER_KERNEL)
        if not old_jup_kernel.resource_dir.startswith(prefix):
            print("Removing existing Jupyter kernel found at {0}".format(
                old_jup_kernel.resource_dir))
        ksm.remove_kernel_spec(XONSH_JUPYTER_KERNEL)
    except NoSuchKernel:
        pass

    if sys.platform == "win32":
        # Ensure that conda-build detects the hard coded prefix
        spec["argv"][0] = spec["argv"][0].replace(os.sep, os.altsep)
        prefix = prefix.replace(os.sep, os.altsep)

    with tempfile.TemporaryDirectory() as d:
        os.chmod(d, 0o755)  # Starts off as 700, not user readable
        with open(os.path.join(d, "kernel.json"), "w") as f:
            json.dump(spec, f, sort_keys=True)

        print("Installing Jupyter kernel spec:")
        print("  root: {0!r}".format(root))
        if user:
            print("  as user: {0}".format(user))
        elif root and prefix:
            print("  combined prefix {0!r}".format(prefix))
        else:
            print("  prefix: {0!r}".format(prefix))
        ksm.install_kernel_spec(d,
                                XONSH_JUPYTER_KERNEL,
                                user=user,
                                prefix=(None if user else prefix))
        return 0
Exemple #3
0
def remove(_ctx) -> None:
    kernel_spec = KernelSpecManager()
    kernel_spec.remove_kernel_spec('michelson')
Exemple #4
0
def _jupyter_kernel(
    user=False,
    prefix=None,
    root=None,
):
    """Generate xonsh kernel for jupyter.

    Parameters
    ----------
    user : -u, --user
        Install kernel spec in user config directory.
    prefix : -p, --prefix
        Installation prefix for bin, lib, etc.
    root : -r, --root
        Install relative to this alternate root directory.
    """
    try:
        from jupyter_client.kernelspec import KernelSpecManager, NoSuchKernel
    except ImportError as e:
        raise ImportError("Jupyter not found in current Python environment") from e

    ksm = KernelSpecManager()

    prefix = prefix or sys.prefix
    spec = {
        "argv": [
            sys.executable,
            "-m",
            "xonsh.jupyter_kernel",
            "-f",
            "{connection_file}",
        ],
        "display_name": "Xonsh",
        "language": "xonsh",
        "codemirror_mode": "shell",
    }

    if root and prefix:
        # os.path.join isn't used since prefix is probably absolute
        prefix = root + prefix

    try:
        old_jup_kernel = ksm.get_kernel_spec(XONSH_JUPYTER_KERNEL)
        if not old_jup_kernel.resource_dir.startswith(prefix):
            print(
                "Removing existing Jupyter kernel found at {}".format(
                    old_jup_kernel.resource_dir
                )
            )
        ksm.remove_kernel_spec(XONSH_JUPYTER_KERNEL)
    except NoSuchKernel:
        pass

    if sys.platform == "win32":
        # Ensure that conda-build detects the hard coded prefix
        spec["argv"][0] = spec["argv"][0].replace(os.sep, os.altsep)
        prefix = prefix.replace(os.sep, os.altsep)

    with tempfile.TemporaryDirectory() as d:
        os.chmod(d, 0o755)  # Starts off as 700, not user readable
        with open(os.path.join(d, "kernel.json"), "w") as f:
            json.dump(spec, f, sort_keys=True)

        print("Installing Jupyter kernel spec:")
        print(f"  root: {root!r}")
        if user:
            print(f"  as user: {user}")
        elif root and prefix:
            print(f"  combined prefix {prefix!r}")
        else:
            print(f"  prefix: {prefix!r}")
        ksm.install_kernel_spec(
            d, XONSH_JUPYTER_KERNEL, user=user, prefix=(None if user else prefix)
        )
        return 0