【问题标题】:decide which package is installed in setup.py file决定在 setup.py 文件中安装哪个包
【发布时间】:2018-07-31 09:26:56
【问题描述】:

为了这个问题,我们假设在一个 git 存储库下,我正在开发 2 个独立的包。考虑以下结构:

my_repo/

    package1/
        ...some modules

    package2/
        ...some modules

    setup.py

setup.py 代码为:

from setuptools import setup

setup(
    name='Cool_package',
    version=1.0,
    description='...',
    author='Myself',
    packages=['package1', 'package2'],
    install_requires=[
                      ...
                     ]
    )

我正在使用此命令以所需方式安装软件包(避免 python setup.py 安装或开发):

pip install -e .

并且 package1 和 package2 都已安装。

我的问题是,考虑到上述结构要求他们共享一个 setup.py 文件,有没有办法只安装两者中的一个(用户决定哪一个)?

同样,我知道这种结构并不理想(理想情况下,我会将包分成 2 个单独的存储库)。

非常感谢!

【问题讨论】:

  • 我可以在这里看到 2 个选项:传递一些 parameter into setup.py(从未尝试过,可能太难了)或为每个包写 setup.py 并分别调用它们
  • 你会在哪里找到这 2 个 setup.py 文件?在每个包主目录下(package1,package2)?
  • 创建当前包目录子目录(如package1目录中的package1)并将每个setup.py脚本放在超级目录中,层次结构示例:my_repo/package1/ setup.py package1/...some modulesmy_repo/package2/ setup.py package2/...some modules跨度>
  • @NI6 顺便说一句,在你提到的问题中,“在一个 git 存储库下,我正在开发 2 个独立的包”。但是,根据setup.py 文件,您有 one 包(\wrt 如何配置 Python 包)恰好安装了两个包(\wrt import 语句)。关于包分发,您只有一个包。如果你想要两个不同的包,你需要两个不同的脚本。另请注意,包是由它们的名称标识的,而不是它们实际打包的内容。此外,对于-e 模式,它甚至都没有关系,因为使用了符号链接。

标签: python setuptools setup.py


【解决方案1】:

我建议您为每个软件包创建一个安装脚本。您可以通过通用的setup.py 脚本共享通用信息,如下所示:

repo/
├── bar
├── foo
├── setup_bar.py
├── setup_foo.py
└── setup.py

2 directories, 3 files

那么常见的setup.py 文件将包含以下代码。它也可以用来同时安装两个包:

from functools import partial
from setuptools import setup

setup = partial(
    setup,
    name='Cool_package',
    version=1.0,
    description='...',
    author='Myself',
    packages=['foo', 'bar']
)

if __name__ == '__main__':
    setup()

单独的setup_*.py 脚​​本将重复使用该信息并且只安装一个包:

from setup import setup

setup(packages=['foo'])  # For `setup_foo.py`.
setup(packages=['bar'])  # For `setup_bar.py`.

这样用户可以通过相应的安装脚本选择安装哪个包。

【讨论】:

  • 那么用户将如何选择 CLI 中需要的包?点安装-e。富?
  • @NI6 您可以通过python setup_*.py develop从特定的安装文件进行安装。
  • @NI6 如果你想使用pip,另一个选项是重命名mv setup.py setup_all.py(以及相应的import语句:from setup_all import setup),然后在安装之前创建一个符号链接点子:ln -s setup_foo.py setup.py && pip install -e .。 pip 总是从setup.py 安装,这显然是(至少hard coded
  • 你能想出一个不使用setup.py开发的方法吗?从我读过的内容来看,依赖关系不太好
  • @NI6 请参阅我上面关于创建符号链接的评论。 pip 将始终尝试从 setup.py 安装。如果您也不喜欢这样,那么您还有两个选择: 1. 为每个包创建一个单独的顶级目录,并有两个单独的 setup.py 脚本(每个包一个)。您仍然可以通过调整sys.path.append('..') 来共享数据。但是,这将改变您实际包的整体结构,从而无法保留 OP 的 setup.py。 2. 创建您自己的pip 分支并对其进行修改,使其允许设置文件规范。
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2011-01-13
  • 2011-09-30
  • 2019-05-09
  • 2021-03-13
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多