Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python setup.py中需要动态安装_Python_Namespaces_Dependencies_Setuptools - Fatal编程技术网

Python setup.py中需要动态安装

Python setup.py中需要动态安装,python,namespaces,dependencies,setuptools,Python,Namespaces,Dependencies,Setuptools,我正在编写一个包含可安装子包的python包,如下所示 my_project ├── subpackage1 │ ├── foo.py │ └── setup.py ├── subpackage2 │ ├── bar.py │ └── setup.py └── setup.py [main] My setup.py如下所示: from setuptools import setup, find_packages from setuptools.command.install i

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

my_project
├── subpackage1
│   ├── foo.py
│   └── setup.py
├── subpackage2
│   ├── bar.py
│   └── setup.py
└── setup.py [main]
My 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”命令之前,install\u需要的已经处理好了

我想你可以试着这样做