【问题标题】:Build and install local package with pip and pipenv使用 pip 和 pipenv 构建和安装本地包
【发布时间】:2020-08-16 21:37:17
【问题描述】:

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

如何构建、安装和升级 A 以便 B 能够调用 A 模块?如何使用pip 执行此操作?还有pipenv?

【问题讨论】:

    标签: python-3.x pip packaging setup.py pipenv


    【解决方案1】:

    在 pip 20.2.2 和 pipenv 2020.6.2 的 python 3.6.9 上测试

    TL;DR

    pipenv install path/to/your/package

    前奏

    Pip 和 pipenv 的工作原理完全相同。为了确保你明白,pip 是你的全局 python 解释器的包管理器。你可以做pip --version 来检查pip 喜欢哪个python。 Pipenv 是一个喜欢特定项目/文件夹的 venv 工具。

    A 包需要__init__.py 文件吗?

    是的。 pip 和 pipenv 需要一个 __init__.py 在 A 中的文件(可以是空的),如果你想能够在 B 中导入 A。(即使最新版本的 python 不需要 __init__.py,看起来 pip 和pipenv 仍然需要它。)

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

    是的。如果项目 A 的根目录下没有 setup.py 文件,pip 和 pipenv 将引发错误(即使您没有构建项目)。

    我需要使用选项-e吗?

    这取决于你想要什么。 See here for more insights.

    结构

    作为示例,我将使用此项目架构 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 的压缩文件。然后就可以安装了(和之前一样验证)。

    点

    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)]
    

    管理模块可见性?

    我们想指定哪个函数/类可以从 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的内部结构。

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

    您应该使用 MANIFEST.in 文件,如 here 解释的那样。

    【讨论】:

    • 这里有用的提示,做一个:“pipenv install path/to/your/package”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2019-01-02
    相关资源
    最近更新 更多