关于python项目导入自定义包的问题

关于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 Locations

class LoginPage():pass

manage.py

from pages.loginPage import LoginPage

from 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

回到顶部