__ init__.py没有将模块变成软件包

问题描述 投票:0回答:1

我不确定这是否是一个愚蠢的问题,但我没有包装和类似此类产品的经验。这是带有文件的树形结构:

.
├── 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仍将其视为“模块”而不是“包”。

python packaging
1个回答
1
投票

您已经完成了几乎所有需要做的事情。但是,导入不会自动采用所有路径并公开它们。您需要执行以下一项操作:

  • 导入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
© www.soinside.com 2019 - 2024. All rights reserved.