【发布时间】:2020-08-16 21:37:17
【问题描述】:
我希望能够在 B 的任何文件中执行:import APackage。 A 和 B 是两个不同的项目/包,它们是本地的。
如何构建、安装和升级 A 以便 B 能够调用 A 模块?如何使用pip 执行此操作?还有pipenv?
【问题讨论】:
标签: python-3.x pip packaging setup.py pipenv
我希望能够在 B 的任何文件中执行:import APackage。 A 和 B 是两个不同的项目/包,它们是本地的。
如何构建、安装和升级 A 以便 B 能够调用 A 模块?如何使用pip 执行此操作?还有pipenv?
【问题讨论】:
标签: python-3.x pip packaging setup.py pipenv
在 pip 20.2.2 和 pipenv 2020.6.2 的 python 3.6.9 上测试
pipenv install path/to/your/package
Pip 和 pipenv 的工作原理完全相同。为了确保你明白,pip 是你的全局 python 解释器的包管理器。你可以做pip --version 来检查pip 喜欢哪个python。 Pipenv 是一个喜欢特定项目/文件夹的 venv 工具。
__init__.py 文件吗?是的。 pip 和 pipenv 需要一个 __init__.py 在 A 中的文件(可以是空的),如果你想能够在 B 中导入 A。(即使最新版本的 python 不需要 __init__.py,看起来 pip 和pipenv 仍然需要它。)
是的。如果项目 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(),
)
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
这是更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 install [path to the zip file (here A/dist/myName-0.1.0.tar.gz)]
通过在 setup.py 中更改项目的版本并再次构建它,您将在 dist 文件夹中找到另一个 zip 文件(以前的版本和新的构建版本)。要更改 pip 或 pipenv 可用的版本,您可以这样做:
只需卸载软件包并重新安装新版本(给它创建的新 zip 文件)。
通过 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 解释的那样。
【讨论】: