![](/img/trans.png)
[英]Import python package after installing it with setup.py, without restarting?
[英]Installing python package from git at tag with setup.py
我在私有 git 倉庫中有一個包 (foo)。 我想通過 bar 的 setup.py 安裝 foo 以供另一個包 bar 使用。 我想要一個特定的版本 - setup.py 中 foo 的版本匹配它的 git 標簽(0.3.2,git 標簽是 v0.3.2)
bar 的 setup.py 如下所示:
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(name='bar',
install_requires=['foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=somedir']
)
我還嘗試在最后明確添加版本:
install_requires=['foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=somedir==0.3.2']
我目前在我的 venv 中安裝了 0.3.1 版。 當我嘗試通過pip install .
安裝這個 setup.py 時pip install .
, 或pip install . -U
pip install . -U
版本沒有升級 - repo 甚至沒有簽出:
Requirement already satisfied, skipping upgrade: foo@ git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src==0.3.2 from
git+ssh://****@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src==0.3.2 in
./venv/lib/python3.8/site-packages (from bar==0.0.0) (0.3.1)
但是,當我直接使用pip安裝foo時,升級就完成了:
pip install git+ssh://git@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src
Collecting git+ssh://****@github.com/fergusmac/foo.git@v0.3.2#subdirectory=src
Cloning ssh://****@github.com/fergusmac/foo.git (to revision v0.3.2) to /tmp/pip-req-build-gxj2duq6
Running command git clone -q 'ssh://****@github.com/fergusmac/foo.git' /tmp/pip-req-build-gxj2duq6
Running command git checkout -q 40fa65eb75fc26541c90ee9e489ae6dd5538db1f
Running command git submodule update --init --recursive -q
...
Installing collected packages: foo
Attempting uninstall: foo
Found existing installation: foo0.3.1
Uninstalling foo-0.3.1:
Successfully uninstalled foo-0.3.1
Running setup.py install for foo... done
Successfully installed foo-0.3.2
我不明白為什么用 setup.py 安裝會產生不同的行為。 我如何確保它檢查回購並尋找正確的版本?
后續問題 - 我將如何指定“檢查 foo 的主分支並安裝任何版本,如果它高於當前安裝的版本”?
你問的是一個准確而有效的問題,但我不相信會出現令人滿意的答案。 我不確定為什么您所做的不起作用,但是使用 pip 和 setuptools 的直接 URL 依賴項是一個新的且相當復雜的功能,並且在 setuptools 方面可能存在錯誤/缺乏。
我假設您想要做的是將包foo
作為bar
的依賴項 - 您實際上不需要使用PEP 508直接 URL 說明符格式。 相反,您可以提供帶有(相對)路徑作為依賴項說明符的pip
或setuptools
,然后使用 Git 子模塊來填充這些路徑。 例如:
git submodule add git@github.com/fergusmac/foo.git
pip install ./foo
這將安裝您添加子模塊時檢出的 foo 的任何版本。 正如這個答案所解釋的,您可以更改子模塊的檢出版本,然后像這樣安裝它:
cd foo
git checkout v0.3.2
cd ..
pip install ./foo
對於 setuptools,您可以像這樣指定它:
from pathlib import Path
...
setup(
name='bar',
install_requires=[
f'foo @ file://localhost/{Path(__file__).parent}/foo/',
],
)
Path(__file__).parent
是包含 bar 的setup.py
文件的目錄。 該位/foo/
的路徑(例如/foo/
在這種情況下)應該是 foo 的子模塊相對於包含 bar 的setup.py
文件的目錄的位置。
后續問題 - 我將如何指定“檢查 foo 的主分支並安裝任何版本,如果它高於當前安裝的版本”?
在子模塊中簽出master
,然后通過pip install --upgrade .
(假設.
是 bar 的項目目錄)。
另見: https : //softwareengineering.stackexchange.com/a/365583/271937
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.