簡體   English   中英

pip和conda有什么區別?

[英]What is the difference between pip and conda?

我知道pip是 python 包的 package 管理器。 但是,我在 IPython 的網站上看到安裝使用conda來安裝 IPython。

我可以使用pip來安裝 IPython 嗎? 當我已經擁有pip時,為什么還要使用conda作為另一個 python package 管理器?

pipconda有什么區別?

引自Conda 博客

涉足python世界這么久,我們都知道pip、easy_install和virtualenv,但這些工具並不能滿足我們所有的具體要求。 主要問題是他們專注於 Python,忽略了非 Python 庫依賴項,例如 HDF5、MKL、LLVM 等,它們的源代碼中沒有 setup.py,也不會將文件安裝到 Python 的站點中- 包目錄。

所以 Conda 是一個打包工具和安裝程序,旨在做比pip做的更多的事情; 處理 Python 包之外的庫依賴項以及 Python 包本身。 Conda 還創建了一個虛擬環境,就像virtualenv一樣。

因此,應該將 Conda 與Buildout進行比較,后者是另一種可讓您同時處理 Python 和非 Python 安裝任務的工具。

因為 Conda 引入了一種新的打包格式,您不能互換使用pip和 Conda; pip無法安裝 Conda 包格式。 您可以通過側(通過安裝使用這兩種工具側pipconda install pip ),但他們不具備互操作性無論是。

自從寫下這個答案后,Anaconda 發布了一個關於理解 Conda 和 Pip新頁面,這也呼應了這一點:

這突出了 conda 和 pip 之間的主要區別。 Pip 安裝 Python 包,而 conda 安裝可能包含用任何語言編寫的軟件的包。 例如,在使用 pip 之前,必須通過系統包管理器或通過下載並運行安裝程序來安裝 Python 解釋器。 另一方面,Conda 可以直接安裝 Python 包和 Python 解釋器。

並進一步

有時需要一個包,它不能作為 conda 包提供,但在 PyPI 上可用並且可以使用 pip 安裝。 在這些情況下,嘗試同時使用 conda 和 pip 是有意義的。

這是一個簡短的概述:

點子

  • 僅限 Python 包。
  • 從源代碼編譯所有內容。 編輯:pip 現在安裝二進制輪子(如果可用)。
  • 受到核心 Python 社區的祝福(即,Python 3.4+ 包含自動引導 pip 的代碼)。

康達

  • Python 不可知論者。 現有包的主要焦點是用於 Python,實際上 Conda 本身是用 Python 編寫的,但您也可以擁有用於 C 庫、R 包或其他任何東西的 Conda 包。
  • 安裝二進制文件。 有一個名為conda build的工具可以從源代碼構建包,但是conda install本身會從已經構建的 Conda 包中安裝東西。
  • 外部的。 Conda 是 Anaconda 的包管理器,Anaconda 是 Continuum Analytics 提供的 Python 發行版,但它也可以在 Anaconda 之外使用。 您可以通過 pip 安裝將它與現有的 Python 安裝一起使用(盡管不建議這樣做,除非您有充分的理由使用現有安裝)。

在這兩種情況下:

  • 用 Python 編寫
  • 開源(Conda 是 BSD,pip 是 MIT)

Conda 的前兩個要點確實使它在許多軟件包中優於 pip。 由於 pip 從源代碼安裝,如果您無法編譯源代碼,用它安裝東西可能會很痛苦(這在 Windows 上尤其如此,但如果包有一些困難的 C 或 FORTRAN 庫,它甚至可以在 Linux 上如此依賴)。 Conda 從二進制安裝,這意味着有人(例如,Continuum)已經完成了編譯包的繁重工作,因此安裝很容易。

如果您有興趣構建自己的包,也有一些差異。 例如,pip 建立在 setuptools 之上,而 Conda 使用它自己的格式,它有一些優點(比如是靜態的,同樣,與 Python 無關)。

其他答案對細節進行了公正的描述,但我想強調一些高層次的觀點。

pip 是一個包管理器,方便安裝、升級和卸載python 包 它也適用於虛擬python環境。

conda 是任何軟件(安裝、升級和卸載)的包管理器。 它還適用於虛擬系統環境。

conda 的設計目標之一是方便用戶所需的整個軟件堆棧的包管理,其中一個或多個 python 版本可能只是一小部分。 這包括低級庫,例如線性代數、編譯器(例如 Windows 上的 mingw)、編輯器、版本控制工具(例如 Hg 和 Git),或任何其他需要分發和管理的東西

對於版本管理,pip 允許您在多個python環境之間切換和管理。

Conda 允許您在多個通用環境之間切換和管理多個通用環境,在這些環境中,多個其他東西的版本號可能會有所不同,例如 C 庫、編譯器、測試套​​件或數據庫引擎等。

Conda 不是以 Windows 為中心的,但在 Windows 上,當需要安裝和管理需要編譯的復雜科學包時,它是目前可用的卓越解決方案。

當我想到在 Windows 上嘗試通過 pip 編譯許多這些包時浪費了多少時間,或者在需要編譯時調試失敗的pip install會話時,我想哭。

最后一點,Continuum Analytics 還托管(免費) binstar.org (現在稱為anaconda.org )以允許常規包開發人員創建他們自己的自定義(構建!)軟件堆棧,他們的包用戶將能夠從conda install .

不要進一步混淆你,但你也可以在你的 conda 環境中使用 pip,它驗證了上面的一般與 python 特定管理器的評論。

conda install -n testenv pip
source activate testenv
pip <pip command>

您還可以將 pip 添加到任何環境的默認包中,以便每次都存在它,因此您不必遵循上述代碼段。

Conda for Data Science文章引用到 Continuum 的網站:

康達 vs pip

Python 程序員可能熟悉 pip 從 PyPI 下載包並管理他們的需求。 雖然 conda 和 pip 都是包管理器,但它們非常不同:

  • Pip 專用於 Python 包,而 conda 與語言無關,這意味着我們可以使用 conda 來管理來自任何語言的包 Pip 從源代碼編譯,conda 安裝二進制文件,消除編譯負擔
  • Conda 在本機創建與語言無關的環境,而 pip 依賴 virtualenv 僅管理 Python 環境雖然建議始終使用 conda 包,但 conda 也包含 pip,因此您不必在兩者之間進行選擇。 例如,要安裝一個沒有 conda 包但可以通過 pip 獲得的 python 包,只需運行,例如:
conda install pip
pip install gensim

引用Conda:神話和誤解(綜合描述):

...

誤區三:Conda 和 pip 是直接競爭對手

現實:Conda 和 pip 服務於不同的目的,並且只在一小部分任務中直接競爭:即在隔離環境中安裝 Python 包。

皮普,代表對於P IPnstalls P ackages,是Python的官方認可的包管理器,並且是最常用的在其上安裝Python包索引(PyPI中)發布的數據包。 pip 和 PyPI 均由 Python Packaging Authority (PyPA) 管理和支持。

簡而言之,pip 是一個通用的 Python 包管理器; conda 是一個與語言無關的跨平台環境管理器。 對於用戶來說,最顯着的區別大概就是這個:pip在任何環境下都安裝python包; conda 在 conda 環境中安裝任何包。 如果您所做的只是在隔離的環境中安裝 Python 包,則 conda 和 pip+virtualenv 大多可以互換,以依賴處理和包可用性為模的一些差異。 我所說的隔離環境是指 conda-env 或 virtualenv,您可以在其中安裝軟件包而無需修改系統 Python 安裝。

即使撇開神話#2,如果我們只關注 Python 包的安裝,conda 和 pip 服務於不同的受眾和不同的目的。 如果您想在現有系統 Python 安裝中管理 Python 包,則 conda 無法幫助您:按照設計,它只能在 conda 環境中安裝包。 如果您想使用許多依賴外部依賴項的 Python 包(NumPy、SciPy 和 Matplotlib 是常見示例),同時以有意義的方式跟蹤這些依賴項,pip 無法幫助您:按照設計,它管理 Python 包並且僅管理 Python 包。

Conda 和 pip 不是競爭對手,而是專注於不同用戶群體和使用模式的工具。

pip是一個包管理器。

conda既是包管理器又是環境管理器。

細節:

在此處輸入圖片說明

參考

對於 WINDOWS 用戶

“標准”打包工具的情況最近有所好轉:

  • 在 pypi 本身上,截至 9 月,現在有 48% 的車輪包。 2015 年 11 日(從 2015 年 5 月的 38% 和 2014 年 9 月的 24% 上升),

  • 現在,每個最新的python 2.7.9 都支持開箱即用的wheel 格式,

“標准”+“調整”打包工具的情況也在改善:

  • 你可以在http://www.lfd.uci.edu/~gohlke/pythonlibs找到幾乎所有關於輪格式的科學包,

  • mingwpy 項目可能有一天會為 Windows 用戶帶來一個“編譯”包,允許在需要時從源代碼安裝所有內容。

“Conda”包裝對於它所服務的市場來說仍然更好,並突出了“標准”應該改進的領域。

(此外,在標准輪系統和 conda 系統或構建中,依賴規范的多重努力並不是非常 Pythonic,如果所有這些打包“核心”技術能夠通過某種 PEP 融合,那就太好了)

要回答原來的問題,
對於安裝包,PIP 和 Conda 是完成同一件事的不同方式。 兩者都是安裝軟件包的標准應用程序。 主要區別在於包文件的來源。

  • PIP/PyPI 將有更多的“實驗性”包,或者更新的、不太常見的包版本
  • Conda 通常會有更完善的軟件包或版本

一個重要的警告旁注:如果您使用兩個源(pip 和 conda)在同一環境中安裝軟件包,這可能會導致以后出現問題。

  • 再造環境會更難
  • 修復包不兼容變得更加復雜

最佳做法是選擇一個應用程序(PIP 或 Conda)來安裝軟件包,然后使用該應用程序安裝您需要的任何軟件包。 但是,在 conda 環境中仍然使用 pip 有很多例外或原因,反之亦然。 例如:

  • 當有您需要的包時,它們只存在於一個上,而另一個則沒有。
  • 您需要一個僅在一種環境中可用的特定版本

(2021 年更新)

點子

  • 基本

  • pip 是 python 的默認包管理器

  • pip 從 Python 3.0 開始內置

  • 用法: python3 -m venv myenv; source myenv/bin/active; python3 -m pip install requests python3 -m venv myenv; source myenv/bin/active; python3 -m pip install requests

  • 軟件包從pypi.org下載,這是主要的公共 python 存儲庫

  • 它可以在可用時安裝預編譯的二進制文件(輪子)或源文件(tar/zip 存檔)。

  • 編譯后的二進制文件很重要,因為許多包混合了 Python/C/other 與第三方依賴項和復雜的構建鏈。 它們必須作為二進制文件分發以備使用。

  • 先進的

  • pip 實際上可以從任何存檔、輪子或 git/svn 存儲庫安裝...

  • ...可以位於磁盤、HTTP URL 或個人 pypi 服務器上。

  • pip install git+https://github.com/psf/requests.git@v2.25.0例如(它可以用於測試補丁)。

  • pip install https://download.pytorch.org/whl/cpu/torch-1.9.0%2Bcpu-cp39-cp39-linux_x86_64.whl (那個輪子是Linux上的Python 3.9)。

  • 從源代碼安裝時,pip 將自動構建包。 (這並不總是可能的,嘗試在沒有谷歌構建系統的情況下構建 TensorFlow :D)

  • 二進制輪可以是特定於 Python 版本和特定於操作系統的,請參閱manylinux規范以最大限度地提高可移植性。

康達

  • 除非您獲得許可,否則您不得將 Anaconda 或來自 Anaconda 的軟件包用於商業用途。

  • Conda 是 conda 的第三方包管理器。

  • 它由anaconda推廣,這是一個 Python 發行版,包括最常見的現成數據科學庫。

  • 當您使用 anaconda 時,您將使用 conda。

  • 軟件包是從anaconda repo下載

  • 它只安裝預編譯包。

  • Conda 有自己的包格式。 它不使用輪子。

  • conda install安裝包。

  • conda build來構建/重建一個包。

  • conda 捆綁了一個 python 解釋器。

  • conda 允許安裝和升級 Python 解釋器。 (點子沒有)。

  • 先進的

  • 從歷史上看,conda 的賣點是支持構建和安裝二進制包,因為 pip 並沒有很好地支持二進制包(直到輪子和 manylinux2010 規范)。

  • 重視建設。 Conda 包具有廣泛的配置格式和元數據,可用於處理依賴項和構建鏈。

  • 一些項目使用 conda 來啟動復雜的構建系統並生成一個輪子,可以將其發布到 pypi.org 並與 pip 一起使用。

easy_install/egg

  • 僅供歷史參考。 不使用
  • Egg 是一種廢棄的包裝格式,它一直使用到 2010 年代中期,並完全被Wheels取代
  • Egg 是一個 zip 存檔,它包含 python 源文件和/或編譯庫。
  • Eggs 與easy_install 和一些早期版本的pip 一起使用。
  • easy_install 是另一個包管理工具,在 pip 和 conda 之前。 它已經死了很久了。
  • 它也引起了很多混亂,就像 pip 與 conda 一樣:D
  • egg 文件加載緩慢,指定不明確,並且特定於操作系統。

從歷史上看,上述三個工具都是開源的,並且是用 Python 編寫的。 然而,conda 背后的公司在 2020 年更新了他們的服務條款以禁止商業用途,請注意!

Funfact :構建 Python 解釋器的唯一嚴格要求的依賴項是 zlib(一個 zip 庫),因為從前需要壓縮才能加載任何進一步的包。

為什么有這么多選擇?

一個好問題。

讓我們深入研究 Python 和計算機的歷史。 =D

純 python 包在任何這些打包程序中都可以正常工作。 問題不僅在於 Python 包。

世界上的大部分代碼都依賴於 C。對於用 C 編寫的 Python 解釋器來說是這樣。對於許多 Python 包來說也是如此,它們通常包裝 C 庫或交織在一起的 python/C/C++/其他代碼。

任何涉及 SSL、壓縮、GUI(X11 和 Windows 子系統)、數學庫、GPU、CUDA 等的東西……通常都涉及到鏈中的一些 C。

這給打包和分發 Python 庫帶來了麻煩,因為不僅僅是 Python 可以在任何地方運行。 必須編譯庫,編譯需要編譯器和額外的依賴項,一旦編譯,生成的二進制文件僅適用於編譯它的特定系統和 python 版本。

最初,python 可以很好地分發純 python 庫,但對分發二進制庫的支持很少。 在 2010 年左右,您會在嘗試使用 numpy 或 cassandra 時遇到很多錯誤。 由於缺少依賴項,它下載了源代碼並無法編譯。 由於目標是另一個操作系統,它下載了預構建的二進制文件並且無法加載 SEGFAULT。 這是一場噩夢。

這是從 2012 年開始通過 pip 和輪子整理的。 為人們采用較新的格式以及將工具傳播到穩定的 Linux 發行版(大多數開發人員依賴 /usr/bin/python)增加很多年,實際上二進制包的問題擴展到 2010 年代后期(第一個命令要運行的是pip install --upgrade pip setuptools在過時的系統上)。

Conda 同時開發了他們自己的解決方案。 Anaconda 專門用於使數據科學庫易於開箱即用(數據科學 = C 和 C++ 無處不在),因此他們必須提出一個包管理器,專門用於解決構建和分發二進制包的問題,​​conda .

如果您現在使用pip install xxx安裝任何軟件包,它就可以正常工作。 這是安裝包的推薦方式,它內置在當前版本的 Python 中。

我可以使用 pip 安裝 iPython 嗎?

當然,兩者(頁面上的第一種方法)

pip install ipython

和(第三種方法,第二種是conda

您可以從 GitHub 或 PyPI 手動下載 IPython。 要安裝這些版本之一,請解壓縮它並使用終端從頂級源目錄運行以下命令:

 pip install .

官方推薦的安裝方式

當我已經有了 pip 時,為什么要使用 conda 作為另一個 python 包管理器?

正如這里所說:

如果您需要一個特定的包,可能只用於一個項目,或者您需要與其他人共享該項目,則 conda 似乎更合適。

Conda 超過 pip ( YMMV )

  • 使用非 Python 工具的項目
  • 與同事分享
  • 版本間切換
  • 在具有不同庫版本的項目之間切換

pip 和 conda 有什么區別?

這是其他人廣泛回答的。

(2022 年更新)這個答案來自@user5994461 上面的答案

您可以使用 pip 進行 package 管理。 Pip 是 Python.org 的官方內置 package 管理器自 ZA7F5F35426B9238173Z.org 起

pip 不是虛擬環境管理器。

pip

  • 基本

  • pip 是 python 的默認 package 管理器

  • pip 自 Python 3.0 起內置

  • 用法: python3 -m venv myenv; source myenv/bin/activate; python3 -m pip install requests python3 -m venv myenv; source myenv/bin/activate; python3 -m pip install requests

  • 包從pypi.org下載,官方公共 python 存儲庫

  • 它可以在可用時安裝預編譯的二進制文件(輪子)或源文件(tar/zip 存檔)。

  • 編譯后的二進制文件很重要,因為許多包混合了 Python/C/其他與第三方依賴項和復雜的構建鏈。 它們必須以二進制文件的形式分發以供使用。

  • 先進的

  • pip 實際上可以從任何存檔、輪子或 git/svn 存儲庫安裝...

  • ...可以位於磁盤上,也可以位於 HTTP URL 或個人 pypi 服務器上。

  • pip install git+https://github.com/psf/requests.git@v2.25.0 (它對於測試分支上的補丁很有用)。

  • pip install https://download.pytorch.org/whl/cpu/torch-1.9.0%2Bcpu-cp39-cp39-linux_x86_64.whl (that wheel is Python 3.9 on Linux).

  • 從源安裝時,pip 將自動構建 package。 (這並不總是可能的,嘗試在沒有谷歌構建系統的情況下構建 TensorFlow:D)

  • 二進制輪子可以是特定於 python 版本和特定於操作系統的,請參閱manylinux規范以最大限度地提高可移植性。

康達

  • conda 是由開源社區維護的開源環境管理器和 package 管理器。 它獨立於 Anaconda, Inc. 並且不需要商業許可即可使用。

  • conda is also bundled into Anaconda Navigator, a popular commercial Python distribution from Anaconda, Inc. Anaconda ) that includes most common data science and Python developer libraries ready-to-use.

  • 當您使用 Anaconda Navigator GUI 時,您將使用 conda。

  • 可以從 conda-forge、anaconda repo 4和其他公共和私有 conda package“渠道”(又名 repos)下載軟件包。

  • 它只安裝預編譯的包。

  • conda 有自己的 package 格式。 它不使用輪子。

  • conda install安裝 package。

  • conda build以構建 package。

  • conda 可以構建 python 解釋器(以及它依賴的其他 C 包)。 這就是為 Anaconda Navigator 構建和捆綁解釋器的方式。

  • conda 允許安裝和升級 Python 解釋器(pip 不允許)。

  • 先進的

  • 從歷史上看,conda 的一個賣點是支持構建和安裝二進制包,因為 pip 不能很好地支持二進制包(直到輪子和 manylinux2010 規范)。

  • 強調構建包。 conda 具有廣泛的構建設置,它存儲大量元數據,以處理依賴項和構建鏈。

  • 一些項目使用 conda 來啟動復雜的構建系統並生成一個輪子,該輪子發布到 pypi.org 的 pip。

  • conda 強調構建和管理虛擬環境。 conda 是設計用來編程的 language-agnostic 虛擬環境管理器。 conda 可以安裝和管理其他 package 管理器,例如 npm、pip 和其他語言的 ZEFE90A8E604A7F6B70DFE 管理器

  • 我可以將 Anaconda Navigator 軟件包用於商業用途嗎? 新語言規定,允許個人愛好者、學生、大學、非營利組織或員工少於 200 人的企業使用,所有其他用途都被視為商業用途,因此需要與 Anaconda 建立業務關系。 (截至 2020 年 10 月 28 日)

  • 如果您是大型開發人員組織,即超過 200 名員工,則不允許您將 Anaconda 或 Anaconda 存儲庫中的軟件包用於商業用途,除非您獲得許可證。

  • 從 conda-forge 存儲庫中提取和使用(正確開源的)包不需要 Anaconda, Inc. 的商業許可。開發人員可以使用 conda-forge 基礎設施中提供的打包工具自由構建自己的 conda 包。

容易安裝/雞蛋

  • 僅供歷史參考。 不使用
  • egg 是 package 的廢棄格式,一直使用到 2010 年代中期,完全被輪子取代
  • 雞蛋是 zip 存檔,它包含 python 源文件和/或編譯庫。
  • 雞蛋與easy_install和 pip 的第一個版本一起使用。
  • easy_install是另一個 package 管理器,在 pip 和 conda 之前。 它已在 setuptools v58.3(2021 年)中刪除。
  • 它也引起了很多混亂,就像 pip vs conda:D
  • egg 文件加載緩慢、指定不明確且特定於操作系統。
  • 每個 egg 都設置在一個單獨的目錄中, import mypackage必須在可能數百個目錄中查找mypackage.py (安裝了多少個庫?)。 這很慢,對文件系統緩存不友好。

Funfact :構建 Python 解釋器的唯一嚴格要求的依賴項是 zlib(一個 zip 庫),因為壓縮是加載更多包所必需的。 雞蛋和輪子包是 zip 文件。

為什么有這么多選擇?

一個好問題。

讓我們深入了解 Python 和計算機的歷史。 =D

純 python 包在任何這些打包器中都可以正常工作。 麻煩不僅在於 Python 包。

世界上大部分代碼都依賴於 C。 Python 解釋器也是如此,它是用 C 編寫的。 對於許多 Python 包來說都是如此,它們是 python 包裝器,圍繞 C 庫或混合 python/C/C++ 代碼的項目。

Anything that involves SSL, compression, GUI (X11 and Windows subsystems), math libraries, GPU, CUDA, etc... is typically coupled with some C code.

這給 package 和分發 Python 庫帶來了麻煩,因為它不僅僅是可以在任何地方運行的 Python 代碼。 該庫必須經過編譯,編譯需要編譯器和系統庫以及第三方庫,然后編譯后,生成的二進制代碼僅適用於編譯它的特定系統和 python 版本。

最初,python 可以很好地分發純 python 庫,但很少支持分發二進制庫。 在 2010 年及前后,您在嘗試使用numpycassandra時會遇到很多錯誤。 由於缺少依賴項,它下載了源代碼並無法編譯。 或者它下載了一個預構建的 package(當時可能是一個雞蛋)並且在使用時它會因 SEGFAULT 而崩潰,因為它是為另一個系統構建的。 這是一場噩夢。

從 2012 年開始,pip 和車輪解決了這個問題。 然后等待許多年人們采用這些工具並將這些工具傳播到穩定的 Linux 發行版(許多開發人員依賴/usr/bin/python )。 二進制包的問題延伸到 2010 年代后期。

作為參考,這就是為什么要運行的第一個命令是python3 -m venv myvenv && source myvenv/bin/activate && pip install --upgrade pip setuptools在過時的系統上,因為操作系統帶有 5 年前的舊 python+pip錯誤且無法識別當前的 package 格式。

Continuum Analytics(后來更名為 Anaconda, Inc.)並行開發了自己的解決方案(發布為 Anaconda Navigator)。 Anaconda Navigator was specifically meant to make data science libraries easy to use out-of-the-box (data science = C and C++ everywhere), hence they came up with a package manager specifically meant to address building and distributing binary packages, and built它進入環境管理器conda。

如果您現在安裝任何 package 和pip install xxx ,它通常可以正常工作。 pip 是推薦的方法來安裝內置於當前版本 Python 的軟件包。

pip僅適用於 Python

conda僅適用於 Anaconda + 其他科學包,如 R 依賴項等。不是每個人都需要 Python 自帶的 Anaconda。 Anaconda 主要適用於那些從事機器學習/深度學習等工作的人。休閑 Python 開發人員不會在他的筆記本電腦上運行 Anaconda。

我可能已經發現了另一個性質較小的差異。 我在/usr而不是/home或其他什么地方有我的 python 環境。 為了安裝到它,我必須使用sudo install pip 對我來說, sudo install pip的不良副作用與其他地方廣泛報道的略有不同:這樣做之后,我必須使用sudo運行python才能導入任何sudo安裝的包。 我放棄了,最終發現我可以使用sudo conda將包安裝到/usr下的環境中,然后正常導入而無需python sudo權限。 我什至使用sudo conda來修復損壞的pip而不是使用sudo pip uninstall pipsudo pip --upgrade install pip

到 2021 年, conda依賴解決時間變得不可接受。 我正在切換到曼巴來管理conda環境。

如果您正在使用 conda,一定要嘗試一下mamba

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM