标签: python-importlib

如何使用importlib.import_module在Python中导入模块

我试图importlib.import_module在Python 2.7.2中使用并遇到奇怪的错误.

考虑以下目录结构:

    a
    |
    + - __init__.py
      - b
        |
        + - __init__.py
          - c.py

a/b/__init__.py 具有以下代码:

    import importlib

    mod = importlib.import_module("c")

(在实际代码中"c"有一个名字.)

试着import a.b,产生以下错误:

    >>> import a.b
    Traceback (most recent call last):
      File "", line 1, in 
      File "a/b/__init__.py", line 3, in 
        mod = importlib.import_module("c")
      File "/opt/Python-2.7.2/lib/python2.7/importlib/__init__.py", line 37, in   import_module
        __import__(name)
    ImportError: No module named c

我错过了什么?

谢谢!

python import module python-importlib

57
推荐指数
3
解决办法
8万
查看次数

Python 3.5+:如何在给定完整文件路径的情况下动态导入模块(在存在隐式兄弟导入的情况下)?

标准库清楚地记录了如何直接导入源文件(给定源文件的绝对文件路径),但如果源文件使用隐式同级导入,则此方法不起作用,如下例所示.

如果这个例子适用于隐式兄弟导入的存在?

我已经签出这个这个其他的话题#1的问题,但他们并没有解决隐同级进口用手导入的文件.

设置/实施例

这是一个说明性的例子

目录结构:

root/
  - directory/
    - app.py
  - folder/
    - implicit_sibling_import.py
    - lib.py
Run Code Online (Sandbox Code Playgroud)

app.py:

import os
import importlib.util

# construct absolute paths
root = os.path.abspath(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
isi_path = os.path.join(root, 'folder', 'implicit_sibling_import.py')

def path_import(absolute_path):
   '''implementation taken from https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly'''
   spec = importlib.util.spec_from_file_location(absolute_path, absolute_path)
   module = importlib.util.module_from_spec(spec)
   spec.loader.exec_module(module)
   return module

isi = path_import(isi_path)
print(isi.hello_wrapper())
Run Code Online (Sandbox Code Playgroud)

lib.py:

def hello():
    return 'world'
Run Code Online (Sandbox Code Playgroud)

implicit_sibling_import.py:

import lib # this is the …
Run Code Online (Sandbox Code Playgroud)

python import python-3.x python-importlib

29
推荐指数
2
解决办法
6185
查看次数

Python:如何动态地从模块导入所有方法和属性

我想动态加载一个模块,给出它的字符串名称(来自环境变量).我正在使用Python 2.7.我知道我可以这样做:

import os, importlib
my_module = importlib.import_module(os.environ.get('SETTINGS_MODULE'))
Run Code Online (Sandbox Code Playgroud)

这大致相当于

import my_settings
Run Code Online (Sandbox Code Playgroud)

(哪里SETTINGS_MODULE = 'my_settings').问题是,我需要相当于的东西

from my_settings import *
Run Code Online (Sandbox Code Playgroud)

因为我希望能够访问模块中的所有方法和变量.我试过了

import os, importlib
my_module = importlib.import_module(os.environ.get('SETTINGS_MODULE'))
from my_module import *
Run Code Online (Sandbox Code Playgroud)

但我得到了一堆错误.有没有办法在Python 2.7中动态导入模块的所有方法和属性?

python python-import python-2.7 python-importlib

17
推荐指数
1
解决办法
5434
查看次数

从模块动态导入类

我有一个叫做'my_class'放入的课程'my_module'.我需要导入这个类.我试着这样做:

import importlib
result = importlib.import_module('my_module.my_class')
Run Code Online (Sandbox Code Playgroud)

但它说:

ImportError: No module named 'my_module.my_class'; 'my_module' is not a package
Run Code Online (Sandbox Code Playgroud)

所以.我可以看到它只适用于模块,但不能处理类.如何从模块导入类?

python python-3.x python-importlib

13
推荐指数
2
解决办法
6862
查看次数

导入错误:无法从“importlib”导入名称“元数据”

Python 3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32Anaconda 提示中启动的 python ( ) 会话下,我收到错误

>>> import nbconvert
Traceback (most recent call last):
  File "C:\Users\user1\Anaconda\lib\site-packages\jsonschema\__init__.py", line 31, in <module>
    from importlib import metadata
ImportError: cannot import name 'metadata' from 'importlib' (C:\Users\user1\Anaconda\lib\importlib\__init__.py)
Run Code Online (Sandbox Code Playgroud)

有效地,metadata不在importlib

>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_loader', 'import_module', 'invalidate_caches', …
Run Code Online (Sandbox Code Playgroud)

python importerror python-importlib

13
推荐指数
2
解决办法
2万
查看次数

在importlib.reload之前更改环境变量

我有一个c-extension在静态初始化期间加载环境变量.我需要能够更改这些值并重新加载模块(我无法更改它们是静态加载的事实).我试着设置os.environ,但似乎没有成为一个env在选择importlibsubprocess.call

这是一个例子:假设我有一个如下定义的模块

#include <boost/python.hpp>
#include <cstdlib>
#include <string>
std::string get() {
    return ::getenv("HOME");
}

BOOST_PYTHON_MODULE(sample) {
    boost::python::def("get", &get);
}
Run Code Online (Sandbox Code Playgroud)

我有python代码:

import importlib, os
import sample as s
print(s.get()) # prints /home/username

# do something like 
# os.environ['HOME'] = 'foo'
importlib.reload(s)
print(s.get()) # I would like this to print 'foo'
Run Code Online (Sandbox Code Playgroud)

换句话说,我可以做什么而不是os.environ['HOME'] = 'foo'导致环境变量在c模块中改变?

注意:我无法使用,setenv因为变量是静态加载的,我无法重新初始化所有依赖于它们的东西.

python python-3.x python-importlib

10
推荐指数
1
解决办法
689
查看次数

导入错误:Jupyter笔记本中的DLL加载失败但在.py文件中工作

我在Anaconda环境中安装了BreakoutDetection模块.当我尝试import breakout_detection在jupyter笔记本中导入模块时,我得到以下错误

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-18-96c0fdb15b96> in <module>()
----> 1 import breakout_detection

C:\Users\sgadiyar\AppData\Local\Continuum\Anaconda2\lib\site-packages\breakout_detection.py in <module>()
     15         except ImportError:
     16             return importlib.import_module('_breakout_detection')
---> 17     _breakout_detection = swig_import_helper()
     18     del swig_import_helper
     19 elif _swig_python_version_info >= (2, 6, 0):

C:\Users\sgadiyar\AppData\Local\Continuum\Anaconda2\lib\site-packages\breakout_detection.py in swig_import_helper()
     14             return importlib.import_module(mname)
     15         except ImportError:
---> 16             return importlib.import_module('_breakout_detection')
     17     _breakout_detection = swig_import_helper()
     18     del swig_import_helper

C:\Users\sgadiyar\AppData\Local\Continuum\Anaconda2\lib\importlib\__init__.pyc in import_module(name, package)
     35             level += 1
     36         name = _resolve_name(name[level:], package, level)
---> 37 …
Run Code Online (Sandbox Code Playgroud)

python swig anaconda python-importlib jupyter-notebook

10
推荐指数
4
解决办法
2万
查看次数

使用importlib.util检查库时出错

我正在尝试使用importlib库来验证在Python 3.5.2中执行脚本的计算机上是否安装了nmap库

我正在尝试使用importlib.util.find_spec("nmap")但收到以下错误.

>>> import importlib
>>> importlib.util.find_spec("nmap")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
Run Code Online (Sandbox Code Playgroud)

谁能告诉我哪里出错了?

编辑

我能够使用以下代码使函数工作.

#!/usr/bin/pythonw

import importlib
from importlib import util

#check to see if nmap module is installed
find_nmap = util.find_spec("nmap")
if find_nmap is None:
    print("Error")
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-importlib

9
推荐指数
1
解决办法
6327
查看次数

如何使用 importlib.resources.path(package, resource)?

我正在使用以下代码创建一个 _GeneratorContextManager。

try:
    import importlib.resources as pkg_resources
except ImportError:
    # Try backported to PY<37 `importlib_resources`.
    import importlib_resources as pkg_resources
from . import file_resources

package_path= pkg_resources.path(file_resources, "IWNLP.Lemmatizer_20181001.json")
Run Code Online (Sandbox Code Playgroud)

这是变量 package_path 的调试器视图。

变量 package_path 的调试器视图

现在我想将文件“IWNLP.Lemmatizer_20181001.json”的路径传递给另一个函数:

 lemmatizer = IWNLPWrapper(lemmatizer_path=package_path)
Run Code Online (Sandbox Code Playgroud)

文档说“上下文管理器提供了一个 pathlib.Path 对象”。如何访问 pathlib.Path 对象?

python python-importlib

9
推荐指数
1
解决办法
5767
查看次数

__init__.py 中的本地范围与相对导入

我注意到asyncio/init.py从 python 3.6 开始使用以下构造:

from .base_events import *

...

__all__ = (base_events.__all__ + ...)
Run Code Online (Sandbox Code Playgroud)

base_events符号未在源代码中的任何位置导入,但模块仍包含它的局部变量。

我已经使用以下代码检查了这种行为,并将其放入一个旁边__init__.py的虚拟对象中test.py

test = "not a module"
print(test)

from .test import *
print(test)
Run Code Online (Sandbox Code Playgroud)

不是模块
<module 'testpy.test' from 'C:\Users\MrM\Desktop\testpy\test.py'>

这意味着test在使用星型导入后变量被隐藏了。

我稍微摆弄了一下,结果发现它不一定是一个星型 import,但它必须在一个 内__init__.py,而且它必须是相对的。否则模块对象不会被分配到任何地方。

如果没有赋值,从一个不是 的文件运行上面的例子__init__.py会引发一个NameError.

这种行为从何而来?这是否已在某处的导入系统规范中进行了概述?__init__.py必须以这种方式与众不同的原因是什么?它不在参考资料中,或者至少我找不到。

python python-importlib

9
推荐指数
1
解决办法
358
查看次数