如何让 setup.py 在子目录中包含一个包?

How can I make setup.py include a package in a subdirectory?

我有一个库 git 存储库 sub_lib,由于各种原因我无法将其直接发布到 pypi 存储库。相反,我将其用作以下结构中另一个库 main_lib 的 git 子模块:

my_repo/
  setup.py
  main_lib/
    __init__.py
  sub_lib/  # a git submodule
    setup.py
    sub_lib/
      __init__.py

main_lib 需要 import sub_lib,那么我如何配置 my_reposetup.py 以同时包含 main_libsub_lib 作为包裹?特别是,是否可以让 setup.py 从子目录中包含一个包(因为它在 sub_lib/sub_lib/ 中)?

当前 setup.py:

from setuptools import setup, find_packages
setup(
  name='main-lib',
  ...,
  packages=find_packages(exclude=['tests*']),
  package_data={'main_lib': ['py.typed'], 'sub_lib': ['py.typed']},
)

还是使用符号链接解决这个问题更好?

我能够通过符号链接实现此功能:

my_repo/
  setup.py
  main_lib/
    __init__.py
  sub_lib_repo/  # a git submodule
    setup.py
    sub_lib/
      __init__.py
  sub_lib -> ./sub_lib_repo/sub_lib

在我的特殊情况下,我需要 sub_lib 也是 main_libpip 子模块,我可以使用第二个符号链接:

my_repo/
  setup.py
  main_lib/
    __init__.py
    sub_lib -> ../sub_lib_repo/sub_lib
  sub_lib_repo/  # a git submodule
    setup.py
    sub_lib/
      __init__.py
  sub_lib -> ./sub_lib_repo/sub_lib

这样,一旦 main_lib 安装了 pip,像 from main_lib.sub_lib.foo import bar 这样的东西就可以工作了,像 from sub_lib.foo import bar 这样的东西就可以工作了(在 sub_lib 中需要导入)。 setup.py 无需更改。