Передать имя пакета как переменную - PullRequest
0 голосов
/ 28 июня 2018

Я хотел бы передать имя пакета в качестве переменной в блокноте jupyter, а затем установить эти пакеты с помощью conda в jupyter. Я подготовил следующий код, но он не работает. Я думаю, что "i" не распознается как numpy в "! Conda install --yes --prefix {sys.prefix} i". Любая помощь будет принята с благодарностью.

import sys
import importlib
a=['numpy','itertools','wxPython']
for i in a:
    try:
        importlib.import_module(i)
        print('%s is imported'%i)
    except ImportError:
        !conda install --yes --prefix {sys.prefix} i
        importlib.import_module(i)
        print('%s was successfully imported'%i)

Это производит:

Error:  
------------
Solving environment: ...working... failed

PackagesNotFoundError: The following packages are not available from current channels:

  - i
------------------------------------------

С моей точки зрения, он хочет установить пакет с именем "i", и поскольку такой пакет недоступен, он возвращает вышеуказанную ошибку. Мне интересно, почему он не может считать «i» равным «numpy» в строке «! Conda install --yes --prefix {sys.prefix} i». Причина в том, что когда я попробовал "! Conda install --yes --prefix {sys.prefix} 'numpy'", ошибки не было.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Чтобы пометить i как переменную, необходимо заключить ее в фигурные скобки. Вот простой пример того, как это работает:

a = 'foo'
!echo a
!echo {a}

Производит:

a
foo

Для вашего конкретного случая это будет выглядеть примерно так:

import sys

a=['numpy','itertools','wxPython']
for i in a:
    try:
        exec('import %s' % i)
        print('%s is imported'%i)
    except ImportError:
        !conda install --yes --prefix {sys.prefix} {i}
        exec('import %s' % i)
        print('%s was successfully imported'%i)

Обратите внимание, что я отключил вызов importlib для строки с exec, чтобы модули были назначены пространству имен. Вероятно, есть более питонский способ сделать это, если вы более знакомы с importlib.

Это не полностью решает проблему для меня, так как я продолжаю получать ModuleNotFoundError s для wxPython, но это решает вашу немедленную ошибку.

0 голосов
/ 28 июня 2018

Используйте функцию __import__ для динамического импорта модуля. Вам необходимо присвоить это переменной.

mod = 'time'
time = __import__(mod)
time.sleep(5)

Вы можете назначить список импортированных пакетов на диктовку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...