猫测试.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 。
有任何想法吗?
是否可以在 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) 我想用来importlib重新加载其名称是动态生成的模块。
例:
import sys
def some_func():
return "sys"
want_reload = some_func()
Run Code Online (Sandbox Code Playgroud)
现在如何sys使用变量重新加载模块want_reload?我不能直接提供给它,importlib.reload()因为它说它需要一个模块,而不是str。
如果提供了无效的字符串或未加载的模块,则可能会更好,例如"........"引发异常。
我有这样的目录结构:
__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 不太熟悉,我只用它做过自动化,所以我对包和其他东西都是新手。
\n我正在使用 Flask、Gunicorn 和 Poetry 创建一个 API。
\n我注意到 pyproject.toml 中有一个版本号,我想创建一个路由 /version 来返回我的应用程序的版本。
\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\nRun Code Online (Sandbox Code Playgroud)\nwsgi.py运行应用程序的主文件在哪里。
我看到人们使用 importlib 但我没有找到如何让它工作,因为它与以下命令一起使用:
\n __version__ = importlib.metadata.version("__package__")
\n但我不知道这个包的含义。
我有以下代码来动态加载模块:
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)
哦,是的,理由是我还想支持导入不是正确包/模块的模块,而只是一些可以在解释器中工作的脚本。
可重现的代码:
import b
Run Code Online (Sandbox Code Playgroud)
print("hi")
Run Code Online (Sandbox Code Playgroud)
import sys, os, …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个简单的可插入 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) 我是 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
所以我必须创建一个运行文件夹,即一个包含一堆我需要运行的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) 我创建了 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) python-importlib ×10
python ×8
celery ×1
django ×1
docker ×1
fastapi ×1
import ×1
linux ×1
plugins ×1
python-2.7 ×1
python-3.5 ×1
python-3.7 ×1
python-3.x ×1
python-os ×1
ubuntu ×1