如何在Python中加载子目录下的所有模块?
我将常用模块放在子目录如何在Python中加载子目录下的所有模块?,python,package,python-import,python-module,Python,Package,Python Import,Python Module,我将常用模块放在子目录lib/中,并希望通过以下方式将所有模块加载到main.py: 但是遇到问题TypeError:“module”对象不可调用。更具体地说,在main.py中: #!/usr/bin/env python from lib import * # cause: TypeError: 'module' object is not callable #from lib.DominatingSets import * # it works dominatingSets = D
lib/
中,并希望通过以下方式将所有模块加载到main.py
:
但是遇到问题TypeError:“module”对象不可调用
。更具体地说,在main.py
中:
#!/usr/bin/env python
from lib import * # cause: TypeError: 'module' object is not callable
#from lib.DominatingSets import * # it works
dominatingSets = DominatingSets()
from DominatingSets import *
from AnalyzeGraph import *
# ...
完整异常回溯:
$ python main.py
Traceback (most recent call last):
File "main.py", line 6, in <module>
dominatingSets = DominatingSets()
TypeError: 'module' object is not callable
lib/_init__.py
的内容如下。(请参阅)
发生这种混淆的部分原因是,您的模块名与您希望从中加载的类的名称相同。(至少,这让它更加混乱。)您的代码确实正确加载了类所在的模块。但是,它不会从这些模块中加载类,这是您实际想要做的 因为类
dominingsets
位于模块lib.dominingsets
中,所以它从根目录开始的完整路径是lib.dominingsets.dominingsets
from lib import *
在你的情况下,我会做同样的事情
from lib import DominatingSets
from lib import AnalyzeGraph
# ...
但是,
from lib import DominatingSets
相当于
import lib.DominatingSets
DominatingSets = lib.DominatingSets
import lib.DominatingSets
DominatingSets = lib.DominatingSets.DominatingSets
但是lib.dominingsets
是一个模块(lib/dominingsets.py
),而不是您想要的类
from lib.DominatingSets import DominatingSets
相当于
import lib.DominatingSets
DominatingSets = lib.DominatingSets
import lib.DominatingSets
DominatingSets = lib.DominatingSets.DominatingSets
这就是它工作的原因:这是您希望导入到名称支配集
中的类
from lib import *
如果您想让from lib import*
导入子模块中的所有类,则需要将这些类导入lib
模块。例如,在lib/\uuuu init\uuuu.py
中:
#!/usr/bin/env python
from lib import * # cause: TypeError: 'module' object is not callable
#from lib.DominatingSets import * # it works
dominatingSets = DominatingSets()
from DominatingSets import *
from AnalyzeGraph import *
# ...
在进行更改时,我建议(和其他人一样)使用普通的Python命名约定,并将模块名称用小写字母表示:将dominingsets.py
更改为dominingsets.py
。那么这个代码就变成了
from dominatingsets import *
from analyzegraph import *
# ...
看看你的回溯,我想你的问题可能就在这里: 首先,让我们看一个例子:
import datetime
d = datetime(2005, 23, 12)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
这次没有问题,因为我们在datetime模块中引用了datetime
对象类型
如果我们这样做:
from datetime import datetime
datetime
<type 'datetime.datetime'>
在导入datetime
模块中的所有类时,也将起作用
你的密码是:
from lib import * # This imports all MODULES within lib, not the classes
#from lib.DominatingSets import * # it works because you import the classes within the DominatingSets Module
您可以使用from lib.dominingsets import dominingsets
来解决问题,或者如果您坚持使用from lib import*
,则将代码更改为dominingsets=dominingsets.dominingsets()
希望这有帮助 我从这里学到了很多。。。但是,如果PYTHONPATH中实际上没有包含这个目录库,那么在lib/_uinit__u;uuuu.py文件中放置什么内容仍然存在问题
我发现除了在调用者文件中添加lib的父目录之外,也就是
sys.path.append( '.../parent_dir_of_lib' )
我(1)必须在调用方文件中另外执行此操作:
sys.path.append( '.../parent_dir_of_lib/lib' )
或者2)必须使lib目录“自加载”,方法是将其放入其_init__u; py.py中:
import sys
from pathlib import Path
parent_dir_str = str( Path(__file__).resolve().parent )
sys.path.append( parent_dir_str )
from analyse_graph import *
from auto_vivification import *
...
我没有看到你发布的代码有任何错误。但是,由于
从lib import*
运行lib
文件夹中所有文件的代码,错误可能来自您未在此处发布的代码。检查由错误引发的行号。@loutre Thx。我更新了问题,请检查。我的意思是错误可能来自/lib/*.py文件中的一段代码。你说从lib.dominingsets导入*起作用,但是其他的呢?(AnalyzeGraph
,AutoVivification
等…)不是由其自身造成的。。如果您在linux上,请在每个模块名称的顶部目录中使用“grep-r”modulename(“.
”)?查看是否有名称冲突的方法。如果您在某个地方使用blah=AnalyzeGraph(stuff)它将命中模块名,而不是类。Mmm可能必须测试AnalyzeGraph.xxx到0。您是否尝试过lib/dominingSets.py?非常好的解释!Thx a lot.Thx作为您的建议。模块应具有简短的所有小写名称,如中所述