关于python项目路径导入自己写的库出错的一点思考
2016-09-21 03:08
453 查看
其实也是在写自己项目的时候遇到的,以前也遇到了但是一直采取的是回避的策略,这次总算弄清楚所以总结一下。
这个项目的顶级目录是medivac,他本身是一个python模块。
熟悉flask的人都知道,在写一个flask项目的时候,我们常常将一个模块的app初始化放在根目录的__init__.py文件中。
然后可以很方便的把其它需要路由的模块都引入到这个__init__.py中达到自动加载并且路由的效果。
另外也可以使用一个叫做flask蓝图的东西(blueprint),将模块细分。
如果是在__init__.py初始化了app(就暂时理解成app=Flask(__name__)),name在views中我们建立一个叫hello的文件,并且写一个函数路由他像这样
会爆出这样的错误
为什么会找不到medivac模块?我们都知道在导入该模块下面__init__.py东西的时候直接写该模块名字就可以,因为__init__.py默认会运行加载。如果使用IDE会发现代码毫无问题,也可以正常跳转。
后来发现并不能这么写,必须要medivac上面还有文件夹包住的时候,这样的寻址才可以。在python看来,他看不到这个根目录,他认为项目目录是
medivac/ 而不是 /medivac/
所以如果改成这样
就可以正常运行了。
但是我觉得这样坑蛮多的,新建一个.py文件来初始化app,然后使用蓝图来路由也是不错的选择。
特别注意,还有一个严重影响模块寻址的环境变量PYTHONPATH,将当前环境变量的PYTHONPATH设置成对应的地址,可以方便的帮助绝对寻址。
另外顺便提一点,关于uwsgi的配置
当指定的chdir是/home/medivac/project/medivac的时候那么module代表的是去哪个文件里找callable 这个app来进行加载。
Reference:
http://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py
这个项目的顶级目录是medivac,他本身是一个python模块。
熟悉flask的人都知道,在写一个flask项目的时候,我们常常将一个模块的app初始化放在根目录的__init__.py文件中。
然后可以很方便的把其它需要路由的模块都引入到这个__init__.py中达到自动加载并且路由的效果。
另外也可以使用一个叫做flask蓝图的东西(blueprint),将模块细分。
如果是在__init__.py初始化了app(就暂时理解成app=Flask(__name__)),name在views中我们建立一个叫hello的文件,并且写一个函数路由他像这样
from medivac import app @app.route("/") def hello(): return "let's move!"
会爆出这样的错误
from medivac import app ImportError: No module named medivac
为什么会找不到medivac模块?我们都知道在导入该模块下面__init__.py东西的时候直接写该模块名字就可以,因为__init__.py默认会运行加载。如果使用IDE会发现代码毫无问题,也可以正常跳转。
后来发现并不能这么写,必须要medivac上面还有文件夹包住的时候,这样的寻址才可以。在python看来,他看不到这个根目录,他认为项目目录是
medivac/ 而不是 /medivac/
所以如果改成这样
from __init__ import app
就可以正常运行了。
但是我觉得这样坑蛮多的,新建一个.py文件来初始化app,然后使用蓝图来路由也是不错的选择。
特别注意,还有一个严重影响模块寻址的环境变量PYTHONPATH,将当前环境变量的PYTHONPATH设置成对应的地址,可以方便的帮助绝对寻址。
另外顺便提一点,关于uwsgi的配置
[uwsgi] # uwsgi 启动时所使用的地址与端口 socket = 127.0.0.1:8001 # 指向网站目录 chdir = /home/medivac/project/medivac # python 程序内用以启动的 application 变量名 module = app callable = app master = True # 处理器数 processes = 1 # 线程数 threads = 1 # 工作进程 workers = 1
当指定的chdir是/home/medivac/project/medivac的时候那么module代表的是去哪个文件里找callable 这个app来进行加载。
Reference:
http://stackoverflow.com/questions/11536764/how-to-fix-attempted-relative-import-in-non-package-even-with-init-py
相关文章推荐
- 关于构建自己的知识体系架构的一点个人思考(转载)
- 关于如何衡量项目的进度一点思考
- 关于自己java项目中出错
- 关于python导入模块和package的一些深度思考
- 结合自己的经验谈一谈关于项目管理的一点感想 推荐
- 关于三种『应用内主题切换』开源项目的一点思考
- 关于导入SVN的项目到Android studio中路径包含中文报错处理
- 关于 Python Iterator 协议的一点思考
- 关于python以及numpy运行速度的一点思考和记录
- 关于项目管理的一点思考!
- 做第一个小项目的一点思考(关于备份文件的妙用以及误删文件解决办法)
- 关于项目关键人物的一点思考
- 关于git项目管理分支策略的一点思考
- 关于项目成功的一点思考
- 关于如何衡量项目的进度一点思考
- 关于jdk版本问题导致的eclipse导入web项目出错解决方法
- 关于Python中的del的一点思考
- 关于项目启动报ibatis.BindingExcetion错误的一点思考(持续更新中)
- 关于解决导入Android-ZBLibrary项目出错问题
- python 中导入自己定义的模块路径