##// END OF EJS Templates
Merge pull request #13055 from meeseeksmachine/auto-backport-of-pr-13052-on-7.x...
Blazej Michalik -
r26652:4dcdce3f merge
parent child Browse files
Show More
@@ -1,103 +1,105 b''
1 1 """Implementation of packaging-related magic functions.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (c) 2018 The IPython Development Team.
5 5 #
6 6 # Distributed under the terms of the Modified BSD License.
7 7 #
8 8 # The full license is in the file COPYING.txt, distributed with this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 import os
12 12 import re
13 13 import shlex
14 14 import sys
15 15
16 16 from IPython.core.magic import Magics, magics_class, line_magic
17 17
18 18
19 19 def _is_conda_environment():
20 20 """Return True if the current Python executable is in a conda env"""
21 21 # TODO: does this need to change on windows?
22 22 conda_history = os.path.join(sys.prefix, 'conda-meta', 'history')
23 23 return os.path.exists(conda_history)
24 24
25 25
26 26 def _get_conda_executable():
27 27 """Find the path to the conda executable"""
28 28 # Check if there is a conda executable in the same directory as the Python executable.
29 29 # This is the case within conda's root environment.
30 30 conda = os.path.join(os.path.dirname(sys.executable), 'conda')
31 31 if os.path.isfile(conda):
32 32 return conda
33 33
34 34 # Otherwise, attempt to extract the executable from conda history.
35 35 # This applies in any conda environment.
36 36 R = re.compile(r"^#\s*cmd:\s*(?P<command>.*conda)\s[create|install]")
37 37 with open(os.path.join(sys.prefix, 'conda-meta', 'history')) as f:
38 38 for line in f:
39 39 match = R.match(line)
40 40 if match:
41 41 return match.groupdict()['command']
42 42
43 43 # Fallback: assume conda is available on the system path.
44 44 return "conda"
45 45
46 46
47 47 CONDA_COMMANDS_REQUIRING_PREFIX = {
48 48 'install', 'list', 'remove', 'uninstall', 'update', 'upgrade',
49 49 }
50 50 CONDA_COMMANDS_REQUIRING_YES = {
51 51 'install', 'remove', 'uninstall', 'update', 'upgrade',
52 52 }
53 53 CONDA_ENV_FLAGS = {'-p', '--prefix', '-n', '--name'}
54 54 CONDA_YES_FLAGS = {'-y', '--y'}
55 55
56 56
57 57 @magics_class
58 58 class PackagingMagics(Magics):
59 59 """Magics related to packaging & installation"""
60 60
61 61 @line_magic
62 62 def pip(self, line):
63 63 """Run the pip package manager within the current kernel.
64 64
65 65 Usage:
66 66 %pip install [pkgs]
67 67 """
68 self.shell.system(' '.join([sys.executable, '-m', 'pip', line]))
68 python = shlex.quote(sys.executable)
69 self.shell.system(" ".join([python, "-m", "pip", line]))
70
69 71 print("Note: you may need to restart the kernel to use updated packages.")
70 72
71 73 @line_magic
72 74 def conda(self, line):
73 75 """Run the conda package manager within the current kernel.
74 76
75 77 Usage:
76 78 %conda install [pkgs]
77 79 """
78 80 if not _is_conda_environment():
79 81 raise ValueError("The python kernel does not appear to be a conda environment. "
80 82 "Please use ``%pip install`` instead.")
81 83
82 84 conda = _get_conda_executable()
83 85 args = shlex.split(line)
84 86 command = args[0]
85 87 args = args[1:]
86 88 extra_args = []
87 89
88 90 # When the subprocess does not allow us to respond "yes" during the installation,
89 91 # we need to insert --yes in the argument list for some commands
90 92 stdin_disabled = getattr(self.shell, 'kernel', None) is not None
91 93 needs_yes = command in CONDA_COMMANDS_REQUIRING_YES
92 94 has_yes = set(args).intersection(CONDA_YES_FLAGS)
93 95 if stdin_disabled and needs_yes and not has_yes:
94 96 extra_args.append("--yes")
95 97
96 98 # Add --prefix to point conda installation to the current environment
97 99 needs_prefix = command in CONDA_COMMANDS_REQUIRING_PREFIX
98 100 has_prefix = set(args).intersection(CONDA_ENV_FLAGS)
99 101 if needs_prefix and not has_prefix:
100 102 extra_args.extend(["--prefix", sys.prefix])
101 103
102 104 self.shell.system(' '.join([conda, command] + extra_args + args))
103 105 print("\nNote: you may need to restart the kernel to use updated packages.")
General Comments 0
You need to be logged in to leave comments. Login now