##// END OF EJS Templates
switch to safe_getattr
switch to safe_getattr

File last commit:

r28437:abf66417
r28794:60967bbd
Show More
packaging.py
151 lines | 4.8 KiB | text/x-python | PythonLexer
Jake VanderPlas
ENH: add pip and conda magics
r24880 """Implementation of packaging-related magic functions.
"""
#-----------------------------------------------------------------------------
# Copyright (c) 2018 The IPython Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------
Samuel Gaist
Implement magic for mamba and micromamba
r28437 import functools
Jake VanderPlas
ENH: add pip and conda magics
r24880 import re
import shlex
import sys
Justin Palmer
Fix capitalization on pathlib import
r26107 from pathlib import Path
Artur Svistunov
Revert "Fix for https://github.com/ipython/ipython/issues/13084"...
r26702
Jake VanderPlas
ENH: add pip and conda magics
r24880 from IPython.core.magic import Magics, magics_class, line_magic
Samuel Gaist
Implement magic for mamba and micromamba
r28437 def is_conda_environment(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
"""Return True if the current Python executable is in a conda env"""
# TODO: does this need to change on windows?
if not Path(sys.prefix, "conda-meta", "history").exists():
raise ValueError(
"The python kernel does not appear to be a conda environment. "
"Please use ``%pip install`` instead."
)
return func(*args, **kwargs)
Jake VanderPlas
ENH: add pip and conda magics
r24880
Samuel Gaist
Implement magic for mamba and micromamba
r28437 return wrapper
Jake VanderPlas
ENH: add pip and conda magics
r24880
Samuel Gaist
Implement magic for mamba and micromamba
r28437
def _get_conda_like_executable(command):
"""Find the path to the given executable
Parameters
----------
executable: string
Value should be: conda, mamba or micromamba
"""
Jake VanderPlas
ENH: add pip and conda magics
r24880 # Check if there is a conda executable in the same directory as the Python executable.
# This is the case within conda's root environment.
Samuel Gaist
Implement magic for mamba and micromamba
r28437 executable = Path(sys.executable).parent / command
if executable.is_file():
return str(executable)
Jake VanderPlas
ENH: add pip and conda magics
r24880
# Otherwise, attempt to extract the executable from conda history.
# This applies in any conda environment.
gousaiyang
Format code
r27495 history = Path(sys.prefix, "conda-meta", "history").read_text(encoding="utf-8")
Blazej Michalik
core.magics.packaging: improve re usage
r26069 match = re.search(
Samuel Gaist
Implement magic for mamba and micromamba
r28437 rf"^#\s*cmd:\s*(?P<command>.*{executable})\s[create|install]",
Blazej Michalik
core.magics.packaging: improve re usage
r26069 history,
flags=re.MULTILINE,
)
if match:
return match.groupdict()["command"]
farisachugthai
BUG: `isfile` is not a method on Path objects...
r26254
Samuel Gaist
Implement magic for mamba and micromamba
r28437 # Fallback: assume the executable is available on the system path.
return command
Jake VanderPlas
ENH: add pip and conda magics
r24880
CONDA_COMMANDS_REQUIRING_PREFIX = {
'install', 'list', 'remove', 'uninstall', 'update', 'upgrade',
}
CONDA_COMMANDS_REQUIRING_YES = {
'install', 'remove', 'uninstall', 'update', 'upgrade',
}
CONDA_ENV_FLAGS = {'-p', '--prefix', '-n', '--name'}
CONDA_YES_FLAGS = {'-y', '--y'}
@magics_class
class PackagingMagics(Magics):
"""Magics related to packaging & installation"""
@line_magic
def pip(self, line):
"""Run the pip package manager within the current kernel.
Usage:
%pip install [pkgs]
"""
Artur Svistunov
Default branch added
r26704 python = sys.executable
Blazej Michalik
Remove branching over whitespace in executable path
r26728 if sys.platform == "win32":
python = '"' + python + '"'
else:
python = shlex.quote(python)
Artur Svistunov
Use `"` for win32, shlex.quote - for any other platform if needed
r26703
Artur Svistunov
Revert "Fix for https://github.com/ipython/ipython/issues/13084"...
r26702 self.shell.system(" ".join([python, "-m", "pip", line]))
Arthur Svistunov
Fix path handling in `pip` line magic (#13052)...
r26650
Jake VanderPlas
print note about kernel restart after installing packages
r24883 print("Note: you may need to restart the kernel to use updated packages.")
Jake VanderPlas
ENH: add pip and conda magics
r24880
Samuel Gaist
Implement magic for mamba and micromamba
r28437 def _run_command(self, cmd, line):
Jake VanderPlas
ENH: add pip and conda magics
r24880 args = shlex.split(line)
farisachugthai
BUG: Don't index args unless we know we can...
r26255 command = args[0] if len(args) > 0 else ""
args = args[1:] if len(args) > 1 else [""]
Jake VanderPlas
ENH: add pip and conda magics
r24880 extra_args = []
# When the subprocess does not allow us to respond "yes" during the installation,
# we need to insert --yes in the argument list for some commands
stdin_disabled = getattr(self.shell, 'kernel', None) is not None
needs_yes = command in CONDA_COMMANDS_REQUIRING_YES
has_yes = set(args).intersection(CONDA_YES_FLAGS)
if stdin_disabled and needs_yes and not has_yes:
extra_args.append("--yes")
# Add --prefix to point conda installation to the current environment
needs_prefix = command in CONDA_COMMANDS_REQUIRING_PREFIX
has_prefix = set(args).intersection(CONDA_ENV_FLAGS)
if needs_prefix and not has_prefix:
extra_args.extend(["--prefix", sys.prefix])
Samuel Gaist
Implement magic for mamba and micromamba
r28437 self.shell.system(" ".join([cmd, command] + extra_args + args))
Matthias Bussonnier
Cleanup unused imports.
r25335 print("\nNote: you may need to restart the kernel to use updated packages.")
Samuel Gaist
Implement magic for mamba and micromamba
r28437
@line_magic
@is_conda_environment
def conda(self, line):
"""Run the conda package manager within the current kernel.
Usage:
%conda install [pkgs]
"""
conda = _get_conda_like_executable("conda")
self._run_command(conda, line)
@line_magic
@is_conda_environment
def mamba(self, line):
"""Run the mamba package manager within the current kernel.
Usage:
%mamba install [pkgs]
"""
mamba = _get_conda_like_executable("mamba")
self._run_command(mamba, line)
@line_magic
@is_conda_environment
def micromamba(self, line):
"""Run the conda package manager within the current kernel.
Usage:
%micromamba install [pkgs]
"""
micromamba = _get_conda_like_executable("micromamba")
self._run_command(micromamba, line)