2017-06-20 118 views
2

我有这样的结构:获取模块模块 - Python的

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] 

然后dinamycally导入。

有什么办法得到这个?

编辑

我从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']

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

+1

'从源导入*'不起作用? – RaminNietzsche

+0

可能重复[如何在Python中导入多个?](https://stackoverflow.com/questions/3260599/how-do-to-multiple-imports-in-python) –

+0

@RaminNietzsche使用'*'我可以使用'source_one'和'source_teo'。在这个例子中,我不知道'sources'中有什么文件,所以,我不能使用它们的名字,我需要在列表中使用它们。 – Gocht

回答

1

这是一种伎俩;),但工作原理:

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])) 
+0

你是对的,这是有效的。 – Gocht

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 *所以它导入所有的模块依赖过于

+0

谢谢,但是我不知道'sources'中的python文件的名称,这就是为什么这应该动态工作。 – Gocht

+0

要通过调用'sources' - >'sources.Class_in_source_one'来使用'source_one'中的类,我需要在'__init __。py'中添加'from source_one import Class_in_source_one'。但是,我再次不知道'sources'中的文件的名称 – Gocht

+0

我编辑了我的答案检查它 –