我制作了一个包含很多包和模块的应用程序。我正在开发这些包(在它们的目录中),并且由于我在包目录中执行文件,因此模块/包的导入路径发生了变化。例如,该项目看起来有点像这样......├── 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__), '../../'))
添加回答
举报
0/150
提交
取消