Python pip从自己的软件包中安装子软件包

时间:2019-09-27 12:43:05

标签: python pip package setup.py

我想从软件包中安装一些特殊的子软件包。

例如,我想使用pkg_a和pkg_b创建软件包。但是我想允许用户选择他要安装的对象。

我想做什么:

git clone https://github.com/pypa/sample-namespace-packages.git
cd sample-namespace-packages
touch setup.py

setup-py:

import setuptools

setup(
    name='native',
    version='1',
    packages=setuptools.find_packages()
)
# for all packages
pip install -e native #Successfully installed native

# for specific
# Throws ERROR: native.pkg_a is not a valid editable requirement. 
# It should either be a path to a local project
pip install -e native.pkg_a native.pkg_b

# for specific
cd native
pip install -e pkg_a # Successfully installed example-pkg-a

我已经在另一个问题答案中看到了这一点,因此必须有可能:Python install sub-package from package

我也已经读过Packaging namespace packages documentation并尝试使用repo

我已经在本机目录中尝试了一些带有额外setup.py的变体,但是我无法处理它,感谢所有帮助。

更新

除了sinoroc的回答外,我还做了一个自己的仓库。我创建了一个包Nmspc,并带有NmspcPing和NmspcPong子包。但是我想允许用户选择他要安装的对象。另外,必须有可能安装整个软件包。

我想做的是这样的:

git clone https://github.com/cj-prog/Nmspc.git
cd Nmspc

# for all packages
pip install Nmspc

# Test import
python3 -c "import nmspc; import nmspc.pong"
# for specific
pip install -e Nmspc.pong # or 
pip install -e pong

# Test import
python3 -c "import pong;"

2 个答案:

答案 0 :(得分:1)

针对您的用例的解决方案似乎与我在此处提供的解决方案相似: https://stackoverflow.com/a/58024830/11138259,以及您在问题中链接的链接:Python install sub-package from package

这是一个例子...

目录树可能看起来像这样:

.
├── Nmspc
│   ├── nmspc
│   │   └── _nmspc
│   │       └── __init__.py
│   └── setup.py
├── NmspcPing
│   ├── nmspc
│   │   └── ping
│   │       └── __init__.py
│   └── setup.py
└── NmspcPong
    ├── nmspc
    │   └── pong
    │       └── __init__.py
    └── setup.py

3个Python项目:

  • NmspcPing 提供nmspc.ping
  • NmspcPong 提供nmspc.pong
  • Nmspc 取决于其他两个项目(并且还提供nmspc._nmspc,请参见下文以了解详情)

它们都是命名空间包。它们是根据Python Packaging User Guide on "Packaging namespace packages, Native namespace packages"中的说明构建的。还有另一个示例here

项目 Nmspc 基本为空,没有实际代码,但重要的部分是将其他两个 NmspcPing NmspcPong 添加为< em>安装要求。要注意的另一件事是,为了方便起见,它也是一个 namespace包,其中nmspc._nmspc被隐藏了(最主要的下划线是Python中隐藏内容的命名约定)。

NmspcPing/setup.py(和类似的NmspcPong/setup.py):

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='NmspcPing',
    version='1.2.3',
    packages=['nmspc.ping',],
)

Nmspc/setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='Nmspc',
    version='1.2.3',
    packages=['nmspc._nmspc',],
    install_requires=['NmspcPing', 'NmspcPong',],
)

假设您位于根目录中,则可以这样安装它们以进行开发:

$ python3 -m pip install -e NmspcPing
$ python3 -m pip install -e NmspcPong
$ python3 -m pip install -e Nmspc

然后您应该可以像这样使用它们:

$ python3 -c "import nmspc.ping; import nmspc.pong; import nmspc._nmspc;"

更新

这可以简化:

.
├── NmspcPing
│   ├── nmspc
│   │   └── ping
│   │       └── __init__.py
│   └── setup.py
├── NmspcPong
│   ├── nmspc
│   │   └── pong
│   │       └── __init__.py
│   └── setup.py
└── setup.py

setup.py

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='Nmspc',
    version='1.2.3',
    install_requires=['NmspcPing', 'NmspcPong',],
)

像这样使用它:

$ python3 -m pip install ./NmspcPing ./NmspcPong/ .
$ python3 -c "import nmspc.ping; import nmspc.pong;"

答案 1 :(得分:0)

如果未从诸如 PyPI 之类的索引安装项目,则无法利用install_requires功能。可以这样做:

.
├── NmspcPing
│   ├── nmspc.ping
│   │   └── __init__.py
│   └── setup.py
├── NmspcPong
│   ├── nmspc.pong
│   │   └── __init__.py
│   └── setup.py
└── setup.py

NmspcPing/setup.py(和类似的NmspcPong/setup.py

import setuptools

setuptools.setup(
    name='NmspcPing',
    version='1.2.3',
    package_dir={'nmspc.ping': 'nmspc.ping'},
    packages=['nmspc.ping'],
)

setup.py

import setuptools

setuptools.setup(
    name='Nmspc',
    version='1.2.3',
    package_dir={
        'nmspc.ping': 'NmspcPing/nmspc.ping',
        'nmspc.pong': 'NmspcPong/nmspc.pong',
    },
    packages=['nmspc.ping', 'nmspc.pong'],
)

这允许以以下任意组合从根文件夹安装:

$ python3 -m pip install .
$ python3 -m pip install ./NmspcPing
$ python3 -m pip install ./NmspcPong
$ python3 -m pip install ./NmspcPing ./NmspcPong