簡體   English   中英

使用 pip 和 pipenv 構建和安裝本地 package

[英]Build and install local package with pip and pipenv

我希望能夠在 B 的任何文件中執行以下操作: import APackage A 和 B 是兩個不同的項目/包,它們是本地的。

如何構建、安裝和升級 A 以便 B 能夠調用 A 模塊? 如何用pip做到這一點? pipenv

在 python 3.6.9 和 pip 20.2.2 和 pipenv 2020.6.2 上測試

TL;博士

pipenv install path/to/your/package

序幕

Pippipenv的工作原理完全相同。 為了確保您理解, pip是您的全局 python 解釋器的 package 管理器。 您可以執行pip --version來檢查 python、pip 喜歡哪個。 Pipenv是一個喜歡特定項目/文件夾的 venv 工具。

我需要 A 包的__init__.py文件嗎?

是的。 pip and pipenv need an __init__.py file (can be empty) in A if you want to be able to import A in B. (Even if recent versions of python doesn't need __init__.py , it seems pip and pipenv still need它。)

我需要 A 中的 setup.py 文件嗎?

是的。 如果項目 A 的根目錄下沒有 setup.py 文件,pip 和 pipenv 將引發錯誤(即使您沒有構建項目)。

我需要使用選項-e嗎?

這取決於你想要什么。 有關更多見解,請參見此處

結構

例如,我將這個項目架構用於 A:

A/
 | myPackage/
      | __init__.py
      | myfile.py (contains a hello() function) 
 | setup.py
 | MANIFEST.in

setup.py 文件包含這個(更多詳細信息的 setuptools 頁面):

from setuptools import setup, find_packages
setup(
    name="myName",
    version="0.1",
    packages=find_packages(),
)

導入 A 而不構建它

pip

pip install [local path to my project folder (here A/)]

然后您可以通過打開 python shell 來檢查並執行以下操作:

import myPackage

管道

確保您的 pipenv 是正確的 python 版本。 您可以使用以下命令設置具有良好版本的新環境: pipenv --python 3.6命令。

pipenv install [local path to my project folder (here A/)]

您可以通過執行以下操作進行驗證:

pipenv shell
python
import myPackage

在導入之前構建您的項目

這是更蟒蛇的方式。

要構建您的項目,go 在您的項目文件夾(此處為 A/)中並運行以下命令:

 python3 setup.py sdist

它將創建一個dist/文件夾,您會在其中找到一個 zip 文件,例如A/dist/myName-0.1.0.tar.gz 然后您可以安裝它(並以與以前相同的方式進行驗證)。

Pip

pip install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]

管道

 pipenv install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]

版本處理

通過在 setup.py 中更改項目的版本並再次構建它,您將在 dist 文件夾中找到一個 zip 文件(以前的版本和新的構建版本)。 要更改 pip 或 pipenv 可用的版本,您可以這樣做:

對於 pip

只需卸載 package 並重新安裝新版本(為其創建新的 zip 文件)。

對於 pipenv

通過 Pipfile 中的新 zip 文件更改路徑。 為了避免並發錯誤,您可以簡單地刪除您的 Pipfile.lock。 然后簡單地運行:

pipenv upgrade

卸載

pip uninstall [value of field 'name' in setup.py (here myName)]

管理模塊可見性?

我們想指定哪些 function / class 可以從 B 訪問,哪些不能。

一種方法是在 object 名稱的開頭使用前導下划線,這意味着:內部 object,不應該被導入),如PEP 8中所述。

另一種方法是簡單地使用您的__init__.py文件。 在我們的例子中,如果我們在__init__.py中這樣做: from myPackage.myfile import hello 然后,在 B 項目中,你可以這樣做: from myPackage import hello 使用空的__init__.py文件,您需要編寫: from myPackage.myfile import hello ,假設您知道項目 A 的內部結構。

從我的構建中排除文件和文件夾

您應該使用此處解釋的 MANIFEST.in 文件。

暫無
暫無

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

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