标签: python-importlib

importlib 找不到模块

猫测试.py

from importlib import import_module

bar = import_module('bar', package='project')
Run Code Online (Sandbox Code Playgroud)

ls项目/

__init__.py  
__init__.pyc
bar.py
bar.pyc
Run Code Online (Sandbox Code Playgroud)

蟒蛇测试.py

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    bar = import_module('bar', package='project')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named bar
Run Code Online (Sandbox Code Playgroud)

列出导入的模块(sys.modules)不显示任何模块项目

我可以使用 python shell导入bar 。

有任何想法吗?

python python-importlib

4
推荐指数
1
解决办法
8677
查看次数

在 Celery 任务中动态导入模块

是否可以在 Celery 任务中动态导入模块?

例如,hello.py我的工作目录中调用了一个模块:

$ cat hello.py 
def run():
    print('hello world')
Run Code Online (Sandbox Code Playgroud)

我可以使用importlib以下命令动态导入它:

$ python3
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import importlib
>>> p = importlib.import_module('hello')
>>> p.run()
hello world
Run Code Online (Sandbox Code Playgroud)

我想从 Celery 任务中执行与上述相同的操作:

@celery.task()
def exec_module(module, args={}):
    print('celery task running: %s' % (module))
    print(args)
    print(os.getcwd())
    print(os.listdir())

    module = importlib.import_module('hello')
    module.run()
Run Code Online (Sandbox Code Playgroud)

任务运行时出现以下错误:

[2016-09-11 17:51:48,132: WARNING/MainProcess] celery@user-HP-EliteBook-840-G2 ready.
[2016-09-11 17:52:05,516: INFO/MainProcess] Received …
Run Code Online (Sandbox Code Playgroud)

python celery python-importlib

4
推荐指数
1
解决办法
3706
查看次数

从字符串importlib.reload模块?

我想用来importlib重新加载其名称是动态生成的模块。

例:

import sys

def some_func():
    return "sys"

want_reload = some_func()
Run Code Online (Sandbox Code Playgroud)

现在如何sys使用变量重新加载模块want_reload?我不能直接提供给它,importlib.reload()因为它说它需要一个模块,而不是str。

如果提供了无效的字符串或未加载的模块,则可能会更好,例如"........"引发异常。

python-3.x python-importlib

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

importlib 不适用于子目录中的文件

我有这样的目录结构:

__init__.py
test.py
dir1/
    __init__.py
    dir2
        __init__.py
        myfile.py
Run Code Online (Sandbox Code Playgroud)

dir2 中可能还有更多 py 文件。所以我想在运行时导入它们并加载这些文件中定义的所有类。

测试.py:

import inspect
import importlib

module = importlib.import_module('dir1/dir2/myfile.py')
for name, obj in inspect.getmembers(module):
    if inspect.isclass(module):
        print(obj.id)   # id is defined in all the classes
Run Code Online (Sandbox Code Playgroud)

这在执行 import_module 时给了我错误:

ModuleNotFoundError:没有名为“dir1/dir2/myfile”的模块

我尝试将 dir1/dir2 路径附加到 sys.path,然后导入 myfile.py,但这也不起作用。类似的代码也可以工作,将 myfile.py 放置在与 test.py 相同的级别。

Python版本:3.7

python python-importlib python-3.7

4
推荐指数
1
解决办法
4700
查看次数

从 python 代码中的 pyproject.toml 获取应用程序版本

我对 python 不太熟悉,我只用它做过自动化,所以我对包和其他东西都是新手。
\n我正在使用 Flask、Gunicorn 和 Poetry 创建一个 API。
\n我注意到 pyproject.toml 中有一个版本号,我想创建一个路由 /version 来返回我的应用程序的版本。
\n我的应用程序结构如下所示:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

wsgi.py运行应用程序的主文件在哪里。

\n

我看到人们使用 importlib 但我没有找到如何让它工作,因为它与以下命令一起使用:
\n __version__ = importlib.metadata.version("__package__")
\n但我不知道这个的含义。

\n

python python-importlib python-packaging python-poetry

4
推荐指数
1
解决办法
4456
查看次数

使用“当前目录”导入导入模块

我有以下代码来动态加载模块:

def load_module(absolute_path):
    import importlib.util
    module_name, _ = os.path.splitext(os.path.split(absolute_path)[-1])
    try:
        py_mod = imp.load_source(module_name, absolute_path)
    except ImportError:
        module_root = os.path.dirname(absolute_path)
        print("Could not directly load module, including dir: {}".format(module_root))
        spec = importlib.util.spec_from_file_location(
            module_name, absolute_path, submodule_search_locations=[module_root, "."])
        py_mod = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(py_mod)
    return py_mod
Run Code Online (Sandbox Code Playgroud)

它工作得非常好,除非它尝试在同一文件夹中导入脚本(而不是同名包的一部分)。例如,脚本a.py正在做import b. 它会导致错误ImportError: No module named 'b'(这在 Python 3 中很常见)。

但我真的很想找到解决这个问题的方法吗?可以通过添加以下内容来解决:

import sys
sys.path.append(".")
Run Code Online (Sandbox Code Playgroud)

编写“a”脚本。

虽然我希望它可以通过以下方式解决:

submodule_search_locations=[module_root, "."]
Run Code Online (Sandbox Code Playgroud)

哦,是的,理由是我还想支持导入不是正确包/模块的模块,而只是一些可以在解释器中工作的脚本。

可重现的代码

〜/示例/ a.py

import b
Run Code Online (Sandbox Code Playgroud)

〜/示例/ b.py

print("hi")
Run Code Online (Sandbox Code Playgroud)

~/somewhere_else/main.py(与 a/b 不同)

import sys, os, …
Run Code Online (Sandbox Code Playgroud)

python import python-importlib python-3.5

3
推荐指数
1
解决办法
3136
查看次数

带有 APIRouter 插件系统的 FastAPI 无法正常工作

我正在尝试创建一个简单的可插入 FastAPI 应用程序,其中插件可以添加或不添加 API 端点

这是我的文件夹结构:

文件夹结构

服务器.py

import importlib
import pkgutil
from pathlib import Path

import uvicorn
from fastapi import FastAPI

PLUGINS_PATH = Path(__file__).parent.joinpath("plugins")
app = FastAPI()


def import_module(module_name):
    """Imports a module by it's name from plugins folder."""
    module = f"plugins.{module_name}"
    return importlib.import_module(module, ".")


def load_plugins() -> list:
    """Import plugins from plugins folder."""
    loaded_apps = []
    for _, application, _ in pkgutil.iter_modules([str(PLUGINS_PATH)]):
        module = import_module(application)
        print(
            f"Loaded app: {module.__meta__['plugin_name']} -- version: {module.__meta__['version']}"
        )
        loaded_apps.append(module)
    return loaded_apps


@app.get("/")
def main():
    return …
Run Code Online (Sandbox Code Playgroud)

python plugins python-importlib fastapi

3
推荐指数
1
解决办法
3162
查看次数

from django.utils.importlib import import_module ImportError: No module named importlib

我是 Django 的新手。我有一个 Django 休息项目。当我运行它时,错误显示为

from django.utils.importlib import import_module
ImportError: No module named importlib
Run Code Online (Sandbox Code Playgroud)

我尝试使用命令安装 importlib

pip install importlib
Run Code Online (Sandbox Code Playgroud)

然后它显示

Requirement already satisfied: importlib in ./lib/python2.7/site-packages/gcm/utils.py"
Run Code Online (Sandbox Code Playgroud)

那么我如何安装 importlib 包?

python django python-2.7 django-rest-framework python-importlib

2
推荐指数
1
解决办法
8484
查看次数

更改目录后找不到模块

所以我必须创建一个运行文件夹,即一个包含一堆我需要运行的python 文件的文件夹。我可以轻松创建此文件夹,并且所有文件都在那里。但是,当我尝试使用运行文件时importlib,python 不会找到它。

我想确保运行的代码实际上是运行文件夹代码,因此我将目录更改为运行文件夹的位置。

abs_path = os.path.abspath("{}".format(run_location))
os.chdir(abs_path)
files = [f for f in os.listdir('.') if os.path.isfile(f)]
print(files)
try:
    driver_module = importlib.import_module("main_driver.py")
    driver_module.main(config, logger)
except Exception as e:
    logger.error("error", str(e))
    finish_fail(config, logger)
finish_success(config, logger)
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我只想运行main_driver.py. 上面的输出是:

['PrepareDataframe.py', 'categorical_encoding.py', 'extra_files.zip', 'build_features.py', 'spot_extractor.py', 'dev.ini', 'featuriser.py', 'main_driver.py', 'time_features_extract.py']
Run Code Online (Sandbox Code Playgroud)

显然,main_driver.py位于当前工作目录中,但我收到此错误。

No module named 'main_driver'
Run Code Online (Sandbox Code Playgroud)

追溯:

Traceback (most recent call last):
  File "./utils/submit.py", line 292, in <module>
    driver_module = importlib.import_module("main_driver")
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, …
Run Code Online (Sandbox Code Playgroud)

python python-importlib python-os

2
推荐指数
1
解决办法
2084
查看次数

Docker Linux 容器内核更新

我创建了 linux ubuntu 容器,但我厌倦了运行 python 脚本。

但它会引发这个错误:

<frozen importlib._bootstrap>:228: RuntimeWarning: Linux supports fsync/fdsync with io_submit since 4.18 but current kernel 4.15.0-55-generic doesn't support it. Related calls will have no effect.
Run Code Online (Sandbox Code Playgroud)

如何更新 docker 容器内的 ubuntu 内核?

有dockerfile:

FROM ubuntu:21.04
RUN apt-get update -y
RUN apt-get upgrade -y
RUN apt-get dist-upgrade -y

RUN apt-get install python3.9 -y
RUN apt-get install python3-pip -y
Run Code Online (Sandbox Code Playgroud)

linux ubuntu docker python-importlib

2
推荐指数
1
解决办法
5651
查看次数