setup.py中的动态install_requires

时间:2018-06-22 14:52:58

标签: python namespaces dependencies setuptools

我正在编写一个带有可安装子包的python包,如下所示。

my_project
├── subpackage1
│   ├── foo.py
│   └── setup.py
├── subpackage2
│   ├── bar.py
│   └── setup.py
└── setup.py [main]

我的setup.py如下:

from setuptools import setup, find_packages
from setuptools.command.install import install

# new install class
class InstallCommand(install):
    # pass argument subpackage from pip install to setup.py
    user_options = install.user_options + [
        ('subpackage=', None, None),  
    ]

    def initialize_options(self):
        install.initialize_options(self)
        self.subpackage = None

    def finalize_options(self):
        install.finalize_options(self)

    def run(self):

        if self.subpackage is None:
            # install all sub-packages
            subpackages = ['my_project.'+x for x in find_packages('./my_project', exclude=['*.tests', '*.tests.*', 'tests.*', 'tests'])]
            self.distribution.packages += ['my_project'] + subpackages 

        else:  
            subpackages = self.subpackage.split(', ')
            print("Install sub-packages:", self.subpackage)
            # install only specific sub-packages
            subpackages = ['my_project.'+x for x in subpackages]
            self.distribution.packages += ['my_project'] + subpackages

        install.run(self)

metadata = dict(
    name='my_project',
    packages=[],
    install_requires=[],
    setup_requires=[],
    cmdclass={
        'install': InstallCommand
    }
    )

setup(**metadata)

它允许我使用类似的命令

来安装所有子包装
$ pip install /path/to/main setup.py/ --install-option="--subpackage=subpackage1, subpackage2"

但是,此setup.py不会安装我选择的子软件包的依赖项(子软件包的依赖关系包含在每个子软件包setup.py的install_requires中)。

有什么方法可以基于命令行输入“ subpackage”为setup()提供动态的install_requires参数吗?

我试图通过添加来修改类InstallCommand(install)中的run(self)函数

self.distribution.install_requires += dependency_ls_function of subpackage

但是它弄乱了命令行输入并导致安装失败。

我还尝试了一个非常简单的示例,其中包含未在环境中安装的软件包“ pipreqs”。

self.distribution.install_requires += ['pipreqs']

安装顺利,但有警告

my_project requires pipreqs, which is not installed.

我想在命令“安装”之前,已经处理了install_requires。

0 个答案:

没有答案