【问题标题】:How can I make setup.py include a package in a subdirectory?如何让 setup.py 在子目录中包含一个包?
【发布时间】:2021-03-19 17:52:19
【问题描述】:

我有一个库 git repo 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']},
)

或者使用符号链接更好地解决这个问题?

【问题讨论】:

  • 显示您的setup.py。您可能需要使用 setuptools.setup() 函数调用的 package_dir 参数。
  • 基本上就是这样:from setuptools import setup, find_packagessetup( name='main-lib', ..., packages=find_packages(exclude=['tests*']), package_data={'main_lib': ['py.typed'], 'sub_lib': ['py.typed']}, )
  • 不要将其添加为评论,编辑您的问题以将您的setup.py 添加到您的问题中。

标签: python git-submodules setup.py


【解决方案1】:

我可以通过符号链接来实现这个功能:

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

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

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2015-07-30
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多