将软件包名称作为变量传递

时间:2018-06-28 18:04:41

标签: python import conda

我想将软件包名称作为变量传递给jupyter笔记本,然后通过conda在jupyter中安装这些软件包。 我已经准备了以下代码,但无法正常工作。 我认为在“!conda install --yes --prefix {sys.prefix} i”中,“ i”不能识别为numpy。 任何帮助将不胜感激。

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”的软件包,并且由于该软件包不可用,因此它返回上述错误。我想知道为什么它不能在“!conda install --yes --prefix {sys.prefix} i”行中认为“ i”等于“ numpy”。原因是当我尝试“!conda install --yes --prefix {sys.prefix}'numpy'”时,没有错误。

2 个答案:

答案 0 :(得分:0)

使用__import__函数动态导入模块。您需要将其分配给变量。

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

您可以将导入的软件包列表分配给字典。

答案 1 :(得分:0)

要标记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更加熟悉,则可能有更Python化的方法来执行此操作。

随着我继续为wxPython获得ModuleNotFoundError,这并不能完全为我解决问题,但是确实可以解决您的直接错误。