我目前有 2 个私有存储库,每个存储库都包含一个 python 包。例如:pkg_a, pkg_b
包 pkg_b 需要 pkg_a 在他的 requirements.txt 和 setup.py 文件中才能工作。
我无法将 pkg_b 与私有包 pkg_a 打包为依赖项,因为 pkg_b 的 setup.py 中的 install_requires 不喜欢我的 requirements.txt 格式:
requirements.txt (pkg_b)
matplotlib==3.5.2
numpy==1.21.6
--extra-index-url https://__token__:<token>@gitlab.com/api/v4/projects/<project>/packages/pypi/simple
pkg_a
setup.py (pkg_b)
def load_requirements(file_name):
with open(file_name) as fp:
reqs = filter(None, (parse_req_line(line) for line in fp))
return list(reqs)
setup(
name='pkg_b',
version="1.0.0",
packages=find_packages(),
install_requires=install_requires,
...
)
安装pkg_b
python .\setup.py install
输出
error in pkg_b setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Parse error at "'--extra-'": Expected W:(abcd...)
(这是预期的,因为 load_requirements() 不处理 --extra-index-url)
在虚拟环境中从 requirements.txt 安装 pkg_a:
电源外壳
python -m venv venv
.\venv\Scripts\activate
python -m pip install --upgrade pip
python -m pip install --no-input -r .\requirements.txt
点列表
...
matplotlib 3.5.2
numpy 1.21.6
pkg_a 1.0.0
...
当我运行导入 pkg_a 的 pkg_b
python 脚本时,一切正常有人说这不是不可能,有人说是,但我找不到可行的解决方案。让我们团结起来寻找答案:)
不可能将这样的
requirements.txt
内容放入包元数据中。从技术上和概念上讲,包元数据不能包含 --extra-index-url
和其他类似的东西。
我推荐你读这个:
在
install_requires
脚本的setuptools.setup()
函数调用的setup.py
参数中,您应该简单地列出pkg_a
作为一个abstract依赖需求。有关此依赖项的更多具体细节不属于包元数据,它们不属于install_requires
。就这么简单。
我还推荐阅读这些:
您可以做的是指示代码的用户直接从包含更具体的依赖项要求的
requirements.txt
文件进行安装。例如在你的文档中,你可以通过这样的命令给出安装的建议:
python -m pip install https://host.dev/path/to/requirements.txt