将包名称作为变量传递
Pass package name as a variable
我想在 jupyter notebook 中将包名称作为变量传递,然后在 jupyter 中通过 conda 安装这些包。
我准备了以下代码,但它不起作用。
我认为 "i" 在“!conda install --yes --prefix {sys.prefix} 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" 的包,但由于这样的包不可用,所以 returns 出现了上述错误。我想知道为什么它不能在“!conda install --yes --prefix {sys.prefix} i”行中考虑 "i" 等于 'numpy'。原因是当我尝试“!conda install --yes --prefix {sys.prefix} 'numpy'”时,没有报错。
使用__import__
函数动态导入模块。您需要将其分配给一个变量。
mod = 'time'
time = __import__(mod)
time.sleep(5)
您可以将导入的包列表分配给字典。
为了将 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)
请注意,我用 exec 切换了一行的 importlib 调用,以便将模块分配给命名空间。如果您更熟悉 importlib,则可能有更 pythonic 的方法来执行此操作。
这并没有完全解决我的问题,因为我继续得到 wxPython 的 ModuleNotFoundError
s,但它确实解决了您的即时错误。
我想在 jupyter notebook 中将包名称作为变量传递,然后在 jupyter 中通过 conda 安装这些包。 我准备了以下代码,但它不起作用。 我认为 "i" 在“!conda install --yes --prefix {sys.prefix} 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" 的包,但由于这样的包不可用,所以 returns 出现了上述错误。我想知道为什么它不能在“!conda install --yes --prefix {sys.prefix} i”行中考虑 "i" 等于 'numpy'。原因是当我尝试“!conda install --yes --prefix {sys.prefix} 'numpy'”时,没有报错。
使用__import__
函数动态导入模块。您需要将其分配给一个变量。
mod = 'time'
time = __import__(mod)
time.sleep(5)
您可以将导入的包列表分配给字典。
为了将 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)
请注意,我用 exec 切换了一行的 importlib 调用,以便将模块分配给命名空间。如果您更熟悉 importlib,则可能有更 pythonic 的方法来执行此操作。
这并没有完全解决我的问题,因为我继续得到 wxPython 的 ModuleNotFoundError
s,但它确实解决了您的即时错误。