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.py
和 MyModule2.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.py
和 MyModule2.py
的所有函数.
然后在 MyPackage_test.py 你可以使用
import MyPackage
from MyPackage import xyz
【讨论】:
以上是关于Python - 在 setup.py 安装之前和之后导入包模块的主要内容,如果未能解决你的问题,请参考以下文章