在Python中跨目录中的多个文件调用通用函数

问题描述 投票:0回答:1

我有一个具有以下结构的Python项目

- my-project/
  - my_project/
    - __init__.py
    - modules_charts/
      - chart_a.py
      - chart_b.py
      - ...
    - main.py
  - poetry.lock
  - pyproject.toml
  - README.md

我的目标是拥有一个动态

modules_charts
文件夹,其中包含具有非标准命名的Python文件的非限制列表。每个文件都包含相同的函数,称为
create_chart()

我希望能够从

create_chart()
脚本中调用所有这些
main.py
函数。

我想避免每次在

main.py
文件夹中添加新文件时更新
modules_charts

到目前为止,我在

main.py
中使用以下代码:

for file_name in sorted(os.listdir("modules_charts")):
    if not file_name.endswith(".py"):
        continue
    module_name = file_name[:-3]
    module = import_module("." + module_name, package="modules_charts")
    module.main()

我对此工作解决方案有两个担忧:

  1. 如果我使用
    python my_project/main.py
  2. 运行脚本,则会产生问题
  3. 可能还有另一种方法,即使用
    import
    __init__.py

在不考虑我运行脚本的目录的情况下实现此目的的正确方法是什么。

python python-import python-module
1个回答
0
投票

您可能想使用

__init__.py
来帮助公开子模块。

main.py

import inspect
import modules_charts

## call every member's create_chart method
for member in inspect.getmembers(modules_charts, inspect.ismodule):
    getattr(modules_charts, member[0]).create_chart()

modules_charts/__init__.py

## directly expose these modules by name
from . import chart_a
from . import chart_b

modules_charts/chart_a.py

def create_chart():
    print("hello")

modules_charts/chart_b.py

def create_chart():
    print("world")

这应该给你:

hello
world

当然,当您想直接公开新图表时,您需要更新

__init__.py
,但这是图表基础设施的一部分,因此问题不像保持图表的使用最新那样大。

© www.soinside.com 2019 - 2024. All rights reserved.