在包中找不到子模块

Can't find submodule within package

我问这个问题有点傻,因为有很多类似的问题,但老实说,我已经搜索了很多,但找不到解决方案。这里是:

我有一个Python包(在TestPyPi, here上是源代码,注意它使用和需要python3.8)结构如下:

paillier/
    setup.py
    test/
    paillier/
        __init__.py
        keygen.py
        util/
            __init__.py
            math_shortcuts.py

我的用例是:在keygen.py,我想用util/math_shortcuts.py
因此,在 keygen.py 中,我有以下导入: from paillier.util.math_shortcuts import generate_coprime, lcm, get_mu.
但是,当我尝试使用我的包时(通过 from paillier.keygen import generate_keys),我收到错误 ModuleNotFoundError: No module named 'paillier.util'

当我使用 TestPyPi 中的 pip 安装它时,这个 ModuleNotFoundError 总是存在,但是当我在本地构建包时它不会发生:当我 运行 pip install -e .paillier/ 目录(setup.py 所在的目录)中,我 可以 运行 from paillier.keygen import generate_keys,即使我的工作目录在某处否则。

我试过from .util.math_shortcuts ...,或from util.math_shortcuts ...,或from paillier.paillier.util.math_shortcuts ...,但都无济于事。


简而言之,pip install --index-url <TestPyPi> rens-paillier 我的文件似乎找不到子模块。
但是,在外部 paillier/ 目录中执行 pip install -e . 时,它似乎有效。

我运行陷入同样的​​问题。 (我的 -e 安装有效,正常安装没有)我的解决方案是,实际命名 setup.py.

中的子包
packages=['paillier', 'paillier.util']

虽然这有效,但我不确定为什么 :D

寻找相同的问题(credits to this post),最简单的可能是使用

setuptools.find_packages()

一些可选参数:

  • where="src" 用于文件位于 src/
  • 中的包结构
  • exclude=["*-old"] 排除一些包(在我的例子中,我想保留 my_package-old 直到我的重构完成)

我发现从 setup.py 文件中的 setup 函数调用中删除 packages 参数解决了我的模块未解析子模块时遇到的类似问题。