繁体   English   中英

Pip 在 python 中从自己的(命名空间)package 安装子包

[英]Pip install sub-package from own (namespace) package in python

我想从 package 安装一些特殊的子包。

例如,我想用 pkg_a 和 pkg_b 创建 package。 但我想让用户选择他想要安装的。

我想做的事:

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

设置-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 文档并尝试使用repo来解决问题

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

更新

除了来自 sinoroc 的答案之外,我还做了一个自己的回购。 我创建了一个 package Nmspc,带有子包 NmspcPing 和 NmspcPong。 但我想让用户选择他想要安装的。 还必须可以安装整个 package。

我想做的是这样的:

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;"

A solution for your use case seems to be similar to the one I gave here: https://stackoverflow.com/a/58024830/11138259 , as well as the one you linked in your question: 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 打包用户指南“打包命名空间包,本地命名空间包”中的说明构建的。 这里还有另一个例子。

项目Nmspc基本是空的,没有实际代码,但重要的是添加另外两个NmspcPingNmspcPong作为安装要求 另一件需要注意的是,为方便起见,它也是一个命名空间 package ,其中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;"

如果项目不是从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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM