我不确定这是否是一个愚蠢的问题,但我没有包装和类似此类产品的经验。这是带有文件的树形结构:
.
├── main.py
└── stringfunc
├── __init__.py
└── toLower.py
main.py:
import sys
import stringfunc
def main():
print(stringfunc.toLower.to_lower(sys.argv[1]))
return 0
if __name__ == "__main__":
main()
toLower.py:
def to_lower(inStr):
return inStr.lower()
并且__init__.py
文件为空。当stringfunc
目录具有__init__.py
文件时,现在不应该表现得像软件包吗?我知道我可以在from .toLower import to_lower
中使用__init__.py
来简化和减少丑陋,但是我只是在书中看到该代码也必须工作,但事实并非如此。因此,恐怕我不了解它的真正工作原理。
这里是错误:
[AttributeError:模块'stringfunc'没有属性'toLower']
显然,Python仍将其视为“模块”而不是“包”。
您已经完成了几乎所有需要做的事情。但是,导入不会自动采用所有路径并公开它们。您需要执行以下一项操作:
stringfunc.toLower
toLower
添加到__init__.py
要在“添加toLower
”选项上展开:
foo/__init__.py
# py2k
> from foobar import foobarval
> import foobaz
# py3k
> from foo.foobar import foobarval
> import foo.foobaz as foobaz
foo/foobar.py
> foobarval = 1
foo/foobaz.py
> foobazval = 2
$ python -c 'import foo; print(foo.foobarval)'
1
$ python -c 'import foo; print(foo.foobaz.foobazval)'
2