我想将软件包名称作为变量传递给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'”时,没有错误。
答案 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
,这并不能完全为我解决问题,但是确实可以解决您的直接错误。