首页 > 解决方案 > 使用 pip 和 pipenv 构建和安装本地包

问题描述

我希望能够在 B 的任何文件中执行以下操作:import APackage. A 和 B 是两个不同的项目/包,它们是本地的。

如何构建、安装和升级 A 以便 B 能够调用 A 模块?如何做到这一点pip?和pipenv

标签: python-3.xpippackagingsetup.pypipenv

解决方案


使用 pip 20.2.2 和 pipenv 2020.6.2 在 python 3.6.9 上测试

TL;博士

pipenv install path/to/your/package

序幕

Pippipenv工作完全一样。为了确保你理解,pip是你的全局 python 解释器的包管理器。您可以pip --version检查 pip 喜欢哪个 python。Pipenv是一个喜欢特定项目/文件夹的 venv 工具。

我需要__init__.pyA 包的文件吗?

是的。__init__.py如果您希望能够在 B 中导入 A,则pip 和 pipenv 需要 A 中的文件(可以为空)。 (即使最新版本的 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 页面):

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 是正确的 python 版本。您可以使用以下命令设置具有良好版本的新环境:pipenv --python 3.6命令。

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

您可以通过执行以下操作进行验证:

pipenv shell
python
import myPackage

在导入之前构建您的项目

这是更蟒蛇的方式。

要构建您的项目,请进入您的项目文件夹(此处为 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 可用的版本,您可以这样做:

对于点

只需卸载软件包并重新安装新版本(给它创建的新 zip 文件)。

对于 pipenv

通过 Pipfile 中的新 zip 文件更改路径。为了避免并发错误,您可以简单地删除您的 Pipfile.lock。然后简单地运行:

pipenv upgrade

卸载

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

管理模块可见性 ?

我们想指定哪些函数/类可以从 B 访问,哪些不能。

一种方法是在对象名称的开头使用前导下划线,这意味着:内部对象,不应该被导入),如PEP 8中所述。

另一种方法是简单地使用您的__init__.py文件。在我们的例子中,如果我们这样做__init__.pyfrom myPackage.myfile import hello然后,在 B 项目中,您可以执行以下操作:from myPackage import hello. 使用一个空__init__.py文件,您需要编写: from myPackage.myfile import hello,假设您知道项目 A 的内部结构。

从我的构建中排除文件和文件夹

您应该使用此处解释的 MANIFEST.in 文件。


推荐阅读