我有一个具有以下结构的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()
我对此工作解决方案有两个担忧:
python my_project/main.py
import
和 __init__.py
在不考虑我运行脚本的目录的情况下实现此目的的正确方法是什么。
您可能想使用
__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
,但这是图表基础设施的一部分,因此问题不像保持图表的使用最新那样大。