Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中加载子目录下的所有模块?_Python_Package_Python Import_Python Module - Fatal编程技术网

如何在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作为您的建议。模块应具有简短的所有小写名称,如中所述