我正在通过在线python课程,并遇到一个我无法完成的问题。我有一个可执行目录,其中包含以下布局
reader/
|--__main__.py
|--reader
|--__init__.py
|--reader.py
|--compressed
|--gzipped.py
|--bzipped.py
|--__init__.py
当我在顶层目录中没有这些模块时,我可以导入很好并使用所有功能。当我将它们放在顶级目录中并使用
从命令行运行可执行文件目录时python reader test.gz
我收到以下错误
AttributeError: module 'reader' has not attribute 'Reader'
main .py的代码是
import sys
import reader
r = reader.Reader(sys.argv[1])
try:
print(r.read())
finally:
r.close()
reader.py的代码是
import os
from reader.compressed import gzipped, bzipped
extension_map = {
'.bz2': bzipped.opener,
'.gz': gzipped.opener,
}
class Reader:
def __init__(self, filename):
extension = os.path.splitext(filename)[1]
opener = extension_map.get(extension, open)
self.f = opener(filename, 'rt')
def close(self):
self.f.close()
def read(self):
return self.f.read()
如果需要,我可以提供其余的文件。我正在使用目前的Anaconda分销。任何帮助或解释将不胜感激。
答案 0 :(得分:0)
在我看来,由于您的__init__.py
文件,文件夹reader
被视为python模块。因此,您的main.py
代码会尝试在文件夹级别找到课程Reader
,但您需要在Reader
内查找reader.py
。你能尝试改变
r = reader.Reader(sys.argv[1])
到
r = reader.reader.Reader(sys.argv[1])
此外,您有许多名为reader的模块/文件/模块,例如:班级Reader
位于reader/reader/reader.py
。我会尽量避免,因为它可能导致混淆。
答案 1 :(得分:0)
当您有多个名称相同的模块/模块时,您通常可以将命名空间转换为递归循环。此外,Reader类是大写的。
如上所述,请尝试 python reader.reader test.gz
在进行故障排除时,请尝试使用tab-complete功能查看模块是否正确加载。