我试图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
我错过了什么?
谢谢!
标准库清楚地记录了如何直接导入源文件(给定源文件的绝对文件路径),但如果源文件使用隐式同级导入,则此方法不起作用,如下例所示.
如果这个例子适用于隐式兄弟导入的存在?
我已经签出这个和这个其他的话题#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 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中动态导入模块的所有方法和属性?
我有一个叫做'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 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) 我有一个c-extension在静态初始化期间加载环境变量.我需要能够更改这些值并重新加载模块(我无法更改它们是静态加载的事实).我试着设置os.environ,但似乎没有成为一个env在选择importlib像subprocess.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因为变量是静态加载的,我无法重新初始化所有依赖于它们的东西.
我在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) 我正在尝试使用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) 我正在使用以下代码创建一个 _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 的调试器视图。
现在我想将文件“IWNLP.Lemmatizer_20181001.json”的路径传递给另一个函数:
lemmatizer = IWNLPWrapper(lemmatizer_path=package_path)
Run Code Online (Sandbox Code Playgroud)
文档说“上下文管理器提供了一个 pathlib.Path 对象”。如何访问 pathlib.Path 对象?
我注意到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 ×10
python-importlib ×10
python-3.x ×4
import ×2
anaconda ×1
importerror ×1
module ×1
python-2.7 ×1
swig ×1