我想从软件包中安装一些特殊的子软件包。
例如,我想使用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;"
答案 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项目:
nmspc.ping
nmspc.pong
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