使用 pip 和 pipenv 构建并安装本地包
Build and install local package with pip and pipenv
我希望能够在 B 的任何文件中执行:import APackage
。 A 和 B 是两个不同的项目/包,它们是本地的。
如何构建、安装和升级A,使B 能够调用A 模块?如何用 pip
做到这一点?还有 pipenv
?
使用 pip 20.2.2 和 pipenv 2020.6.2 在 python 3.6.9 上测试
TL;DR
pipenv install path/to/your/package
序曲
Pip
和 pipenv
的工作原理完全相同。为了确保您理解,pip is the package manager of your global python interpreter. You can do pip --version
to check to which python, pip is liked to. Pipenv 是一个针对特定项目/文件夹的 venv 工具。
A 包需要 __init__.py
文件吗?
是的。如果您希望能够在 B 中导入 A,pip 和 pipenv 需要 A 中的 __init__.py
文件(可以为空)。 (即使 python 的最新版本不需要__init__.py
,看来pip和pipenv还是需要的。)
我需要 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 page for more details):
from setuptools import setup, find_packages
setup(
name="myName",
version="0.1",
packages=find_packages(),
)
导入 A 而不构建它
点
pip install [local path to my project folder (here A/)]
然后你可以打开你的 python shell 检查一下,然后做:
import myPackage
pipenv
确保您的 pipenv 是正确的 python 版本。您可以使用以下命令设置具有良好版本的新环境:pipenv --python 3.6
命令。
pipenv install [local path to my project folder (here A/)]
您可以通过以下方式验证:
pipenv shell
python
import myPackage
在导入之前构建您的项目
这是更 pythonic 的方式。
要构建您的项目,请进入您的项目文件夹(此处为 A/)并运行此命令:
python3 setup.py sdist
它将创建一个 dist/
文件夹,您会在里面找到一个类似 A/dist/myName-0.1.0.tar.gz
的 zip 文件。然后就可以安装了(和之前一样验证)。
点
pip install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]
pipenv
pipenv install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]
版本处理
通过在 setup.py 中更改项目的版本并重新构建它,您会在 dist 文件夹中找到另一个 zip 文件(以前的版本和新的构建版本)。要更改 pip 或 pipenv 可用的版本,您可以这样做:
对于点
只需卸载软件包并重新安装新版本(给它创建的新 zip 文件)。
对于 pipenv
通过您的 Pipfile 中的新 zip 文件更改路径。为避免并发错误,您可以简单地删除您 Pipfile.lock。然后简单地 运行:
pipenv upgrade
卸载
pip uninstall [value of field 'name' in setup.py (here myName)]
管理模块可见性?
我们要指定哪些功能/class 可以从 B 访问,哪些不能。
一种方法是在对象名称的开头使用前导下划线,这意味着:内部对象,不应该被导入)如 PEP 8.
中所述
另一种方法是简单地使用您的 __init__.py
文件。在我们的例子中,如果我们在 __init__.py
中这样做:from myPackage.myfile import hello
。那么,在B项目中,可以做:from myPackage import hello
。对于空的 __init__.py
文件,您需要编写:from myPackage.myfile import hello
,假设您知道项目 A 的内部结构。
从我的构建中排除文件和文件夹
您应该像 here 解释的那样使用 MANIFEST.in 文件。
我希望能够在 B 的任何文件中执行:import APackage
。 A 和 B 是两个不同的项目/包,它们是本地的。
如何构建、安装和升级A,使B 能够调用A 模块?如何用 pip
做到这一点?还有 pipenv
?
使用 pip 20.2.2 和 pipenv 2020.6.2 在 python 3.6.9 上测试
TL;DR
pipenv install path/to/your/package
序曲
Pip
和 pipenv
的工作原理完全相同。为了确保您理解,pip is the package manager of your global python interpreter. You can do pip --version
to check to which python, pip is liked to. Pipenv 是一个针对特定项目/文件夹的 venv 工具。
A 包需要 __init__.py
文件吗?
是的。如果您希望能够在 B 中导入 A,pip 和 pipenv 需要 A 中的 __init__.py
文件(可以为空)。 (即使 python 的最新版本不需要__init__.py
,看来pip和pipenv还是需要的。)
我需要 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 page for more details):
from setuptools import setup, find_packages
setup(
name="myName",
version="0.1",
packages=find_packages(),
)
导入 A 而不构建它
点
pip install [local path to my project folder (here A/)]
然后你可以打开你的 python shell 检查一下,然后做:
import myPackage
pipenv
确保您的 pipenv 是正确的 python 版本。您可以使用以下命令设置具有良好版本的新环境:pipenv --python 3.6
命令。
pipenv install [local path to my project folder (here A/)]
您可以通过以下方式验证:
pipenv shell
python
import myPackage
在导入之前构建您的项目
这是更 pythonic 的方式。
要构建您的项目,请进入您的项目文件夹(此处为 A/)并运行此命令:
python3 setup.py sdist
它将创建一个 dist/
文件夹,您会在里面找到一个类似 A/dist/myName-0.1.0.tar.gz
的 zip 文件。然后就可以安装了(和之前一样验证)。
点
pip install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]
pipenv
pipenv install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]
版本处理
通过在 setup.py 中更改项目的版本并重新构建它,您会在 dist 文件夹中找到另一个 zip 文件(以前的版本和新的构建版本)。要更改 pip 或 pipenv 可用的版本,您可以这样做:
对于点
只需卸载软件包并重新安装新版本(给它创建的新 zip 文件)。
对于 pipenv
通过您的 Pipfile 中的新 zip 文件更改路径。为避免并发错误,您可以简单地删除您 Pipfile.lock。然后简单地 运行:
pipenv upgrade
卸载
pip uninstall [value of field 'name' in setup.py (here myName)]
管理模块可见性?
我们要指定哪些功能/class 可以从 B 访问,哪些不能。
一种方法是在对象名称的开头使用前导下划线,这意味着:内部对象,不应该被导入)如 PEP 8.
中所述另一种方法是简单地使用您的 __init__.py
文件。在我们的例子中,如果我们在 __init__.py
中这样做:from myPackage.myfile import hello
。那么,在B项目中,可以做:from myPackage import hello
。对于空的 __init__.py
文件,您需要编写:from myPackage.myfile import hello
,假设您知道项目 A 的内部结构。
从我的构建中排除文件和文件夹
您应该像 here 解释的那样使用 MANIFEST.in 文件。