关于python项目路径导入本身写的库出错的一点思考

其实也是在写本身项目的时候遇到的,之前也遇到了可是一直采起的是回避的策略,此次总算弄清楚因此总结一下。python

这个项目的顶级目录是medivac,他自己是一个python模块。flask

熟悉flask的人都知道,在写一个flask项目的时候,咱们经常将一个模块的app初始化放在根目录的__init__.py文件中。app

而后能够很方便的把其它须要路由的模块都引入到这个__init__.py中达到自动加载而且路由的效果。socket

另外也可使用一个叫作flask蓝图的东西(blueprint),将模块细分。函数

若是是在__init__.py初始化了app(就暂时理解成app=Flask(__name__)),name在views中咱们创建一个叫hello的文件,而且写一个函数路由他像这样网站

from medivac import app


@app.route("/")
def hello():
    return "let's move!"

会爆出这样的错误spa

from medivac import app
ImportError: No module named medivac

为何会找不到medivac模块?咱们都知道在导入该模块下面__init__.py东西的时候直接写该模块名字就能够,由于__init__.py默认会运行加载。若是使用IDE会发现代码毫无问题,也能够正常跳转。线程

后来发现并不能这么写,必需要medivac上面还有文件夹包住的时候,这样的寻址才能够。在python看来,他看不到这个根目录,他认为项目目录是code

medivac/ 而不是 /medivac/blog

因此若是改为这样

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

相关文章
相关标签/搜索