为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标琳琳 2023-02-07 14:55:08
我制作了一个包含很多包和模块的应用程序。我正在开发这些包(在它们的目录中),并且由于我在包目录中执行文件,因此模块/包的导入路径发生了变化。例如,该项目看起来有点像这样......├── 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
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

$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__), '../../'))


查看完整回答
反对 回复 2023-02-07
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号