![](/img/trans.png)
[英]What is the difference between pipenv install <package> compared to pip install <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 上測試
pipenv install path/to/your/package
Pip
和pipenv
的工作原理完全相同。 為了確保您理解, pip是您的全局 python 解釋器的 package 管理器。 您可以執行pip --version
來檢查 python、pip 喜歡哪個。 Pipenv是一個喜歡特定項目/文件夾的 venv 工具。
__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 文件,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(),
)
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 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 可用的版本,您可以這樣做:
只需卸載 package 並重新安裝新版本(為其創建新的 zip 文件)。
通過 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.