【问题标题】:Get modules in a module - Python获取模块中的模块 - Python
【发布时间】:2017-11-23 14:11:50
【问题描述】:

我有这个结构:

project/
    sources/
        __init__.py
        source_one.py
        source_teo.py
    main.py

然后在main.py

import sources

# Here I'd like to get a list with [source_one, source_two]

然后动态导入它们。

有没有办法得到这个?

编辑

我从dir(sources)得到什么:

如果我这样做import sources,我会得到['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

如果我这样做from sources import *,我会得到['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

如果我这样做from sources import source_one,我会得到['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'source_one']

但是,我不知道sources 包中的文件名,这只是一个例子。我怎样才能找到它们?

【问题讨论】:

  • from sources import * 不起作用?
  • @RaminNietzsche 使用* 我可以使用source_onesource_teo。在此示例中,但我不知道 sources 中将包含什么文件,因此,我不能按名称使用它们,我需要在列表中动态地获取它们。
  • dir(sources) 应该告诉你里面有什么,source1 = __import__("source1", fromlist=(sources,)) 应该做剩下的事情
  • @RaminNietzsche:除非sources 投入额外的工作来支持它,否则这实际上是行不通的。从包中导入* 不会自动加载其子模块。

标签: python python-import python-module


【解决方案1】:

您应该相对于当前文件位置导入

例子:

  1. from sources.source_one import ClassSourceOne
  2. from sources import *

    在示例 2 中,您只能通过 name_of_module.ClassName 调用类

或者您可以使用如下所示的动态导入:import dynamicly from package

另外我建议只导入你使用的类/模块,这就是我推荐的原因

from module import Class 

并且不使用import *,所以它也导入了所有模块依赖项

【讨论】:

  • 谢谢,但我不知道 sources 中的 python 文件的名称,这就是它应该动态工作的原因。
  • 要使用source_one 中的类,只需调用sources -> sources.Class_in_source_one 我需要在__init__.py 中添加from source_one import Class_in_source_one。但是,再一次,我不知道sources中的文件名
【解决方案2】:

这是一种诡计;)但有效:

import os
fileslist = os.listdir("sources")
for item in fileslist:
    if item.endswith("py") and item != "__init__.py":
        exec ("from sources.%s import *" %(item.split('.')[0]))

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多