关于python项目导入自定义包的问题
项目结构如图,root目录为auto_zboa\
项目结构变了一下auto_zboa
└── zboa
├── framework
│ ├── __init__.py
│ └── locations.py
| └── browser_engine.py
| └── logger.py
├── pageobjects
│ ├── __init__.py
│ └── loginPage.py
├── __init__.py
└── manage.py
为啥我在mange.py里导入包from zboa.pages.loginpage import LoginPage总是显示ModuleNotFoundError: No module named 'zboa'
在其他文件夹里导入也是这个错误?
在loginPage.py里
from zboa.framework.locations import Locations
提示ModuleNotFoundError: No module named 'zboa'
如何能保存这样规范的引入方式呢?
回答:
要导入上级目录下模块,使用sys.path:
import sys sys.path.append("..")
import xxx
参考:https://zhuanlan.zhihu.com/p/...
关于你的情况,程序入口在manage.py的话,可以不用上面这个。
模仿目录
auto_zboa└── zboa
├── locations
│ ├── __init__.py
│ └── Locations.py
├── pages
│ ├── __init__.py
│ └── loginPage.py
├── __init__.py
└── manage.py
文件内容
Locations.py
class Locations():pass
loginPage.py
from locations.Locations import Locationsclass LoginPage():pass
manage.py
from pages.loginPage import LoginPagefrom locations.Locations import Locations
运行OK
~/project/auto_zboa$ python zboa/manage.py ~/project/auto_zboa$ cd zboa/
~/project/auto_zboa/zboa$ python manage.py
追加内容~/project/auto_zboa/zboa$ python pages/loginPage.py
运行报错~/project/auto_zboa/zboa$ python -m pages.loginPage
运行OK
如果是在auto_zboa目录下运行,~/project/auto_zboa$ python -m zboa.pages.loginPage
那么loginPage.py中要改为from zboa.locations.Locations import Locations
回答:
引用文章里的话
总的来说,应该在总体结构上避免模块之间互相依赖,即:A依赖B,B就不要依赖A,这也是代码重构的一个目标。
只要找到导致循环引用的模块(最少两个),把引用关系搞清楚,把某个模块让它在真正需要的时候再导入(一般放到函数里面),或者放到代码的最后导入,这样就可以基本解决模块循环依赖的问题。
一个小窍门:查看循环引用的报错栈时,会找到两次导入同一个模块的文件。注意在这个附近找。
总结:在python开发过程中,应尽量避免导入循环(交叉引用),但是,如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。
一些比较靠谱的方法是:
1. 把 import 语句放到方法定义的后面。
2. 将 import 语句移到函数的内部,只有在执行到这个模块时,才会导入相关模块。
以上是 关于python项目导入自定义包的问题 的全部内容, 来源链接: utcz.com/a/165345.html