如何正确地动态导入包中的模块以进行开发/测试

我制作了一个包含很多包和模块的应用程序。我正在开发这些包(在它们的目录中),并且由于我在包目录中执行文件,因此模块/包的导入路径发生了变化。


例如,该项目看起来有点像这样......


├── app.py

└── utils

    ├── database.py

    └── robot

        ├── __init__.py

        ├── run.py

        ├── recognition.py

        └── housekeeping.py

如果我执行python3 app.py则import utils.database有效。


但是,如果我在包中运行python3 run.py则无效。import utils.database


我想知道如何执行函数并导入模块/包而不会出错。


我有这个工作,但我认为这是不对的。到目前为止,我已经尝试__name__ == "__main__"在每个主.py文件中使用 using 和 using sys.path.append,但我觉得必须有一种更简单、更好看的方法。


这就是里面的run.py样子,我也必须在里面做同样的事情database.py,这是最好的方法吗?


if __name__ == "__main__":

    import sys

    sys.path.append('../../')


from utils.robot.recognition import *

from utils.robot.housekeeping import *

import utils.database as db


慕标琳琳
浏览 130回答 1
1回答

长风秋雁

将$PYTHONPATH环境变量设置为包含 的目录utils,然后您的导入将起作用。切勿直接运行包中包含的模块。如果同样直接运行,也可以从包中导入,这是有问题的,因为这样在解释器中就会有模块的两个副本,这肯定会造成混淆。相反,使用-m解释器选项:python -m utils.robot.run或者,如果您永远不需要从其他模块导入 run.py,则可以从包中完全删除该文件并将其保存在单独的“脚本”目录中,然后您就不需要使用-m. 但是您仍然需要设置 sys.path,或者$PYTHONPATH像以前一样使用,或者通过执行 sys.path 操作。如果您选择执行 sys.path 操作,那么无论当前工作目录是什么,您都应该让它工作: sys.path.append(os.path.join(os.path.dirname(__file__), '../../'))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python