Python - 在 setup.py 安装之前和之后导入包模块

Posted

技术标签:

【中文标题】Python - 在 setup.py 安装之前和之后导入包模块【英文标题】:Python - Import package modules before as well as after setup.py install 【发布时间】:2019-05-08 00:03:18 【问题描述】:

假设一个 Python 包(例如,MyPackage)由多个模块(例如,MyModule1.pyMyModule2.py)和一组单元测试(例如,MyPackage_test.py)组成。

.
├── MyPackage
│   ├── __init__.py
│   ├── MyModule1.py
│   └── MyModule2.py
├── README.md
├── requirements.txt
├── setup.py
└── tests
    └── MyPackage_test.py

我想在MyPackage_test.py 的单元测试中导入MyModule1.py 的函数。具体来说,我想通过setup.py install MyPackage在安装包之前和之后导入函数。

目前,我使用两个单独的命令,具体取决于安装包之前或之后的状态:

# BEFORE
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'MyPackage'))

# AFTER
import MyPackage

这可以用一个命令完成吗?

【问题讨论】:

可能不是您想要的,但请查看python setup.py develop 我认为这是不可能的,除非脚本的入口点是包含 setup.py 文件的目录。另请参阅this 帖子了解更多信息。 对我来说,这些看起来像是两个不同的导入。扩展sys.path 时,您根本不能导入MyPackage,只能导入MyModule1 等。您原来的问题是什么?您无法在测试中导入您的包吗? 有趣的问题。我很好奇你为什么要这样做。为什么要在已安装软件包之后运行单元测试? 【参考方案1】:

选项 1

似乎以下命令可以满足我的需要:

sys.path.append(os.path.join(__file__.split(__info__)[0] + __info__), __info__)

选项 2

根据__init__.py 的位置,这也有效:

sys.path.append(os.path.dirname(os.path.split(inspect.getfile(MyPackage))[0]))

选项 3

此外,ResourceManager API 似乎提供了其他方法。

【讨论】:

【参考方案2】:

在 pycharm IDE 中,您可以轻松导入方法。通过将工作目录设置为包含所有文件的文件夹。然后,在 MyPackage __init__.py 文件中导入来自 MyModule1.pyMyModule2.py 的所有函数. 然后在 MyPackage_test.py 你可以使用

import MyPackage 
from MyPackage import xyz

【讨论】:

以上是关于Python - 在 setup.py 安装之前和之后导入包模块的主要内容,如果未能解决你的问题,请参考以下文章

python中的模块通过setup.py怎么安装

python的构建工具——setup.py文件

python setup.py 安装和卸载 的正确姿势

python setup.py install 出错

我的setup.py在python 3.8.1中安装所有依赖项有什么问题

python setup.py - 如何在安装后显示消息