其实也是在写自己项目的时候遇到的,以前也遇到了但是一直采取的是回避的策略,这次总算弄清楚所以总结一下。

这个项目的顶级目录是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

关于python项目路径导入自己写的库出错的一点思考的更多相关文章

  1. Pycharm 项目无法导入自己写的模块(问题记录贴)

    问题背景: 从外部导入一个Python项目后,发现包错误,如图: 解决步骤: 1.将目录下的"5-6——apriori.py"复制一份,重命名为”apriori.py": ...

  2. python 相对路径导入 与 绝对路径导入

    我的理解: 假设有一个文件夹 app 若 app 下有app/__init__.py文件,则此 app 被视作一个 package,而 app 下的其他文件/文件夹被视作 module 我们知道,pa ...

  3. react-native 相对项目路径导入组件

    在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,如果目录多了一长串,书写很烦,看着也不好看. 方法一: 例如你想引入utils里面的文件,不想../. ...

  4. react-native 相对项目路径导入组件 ___ babel-plugin-module-resolver

    babel-plugin-module-resolver 是一个Babel模块解析插件, 在.babelrc中可以配置模块的导入搜索路径. 为模块添加一个新的解析器.这个插件允许你添加新的" ...

  5. python之路径导入

    问题: 最近在学习import的时候,发现不像import xxx,或者from xxx import ooo 这样简单.比如,看下面这个图: 要导入才能在te.py调用pre.tab.py?? 直接 ...

  6. python 根据路径导入模块

    Import python module NOT on path http://stackoverflow.com/questions/10161568/import-python-module-no ...

  7. react-native 相对项目路径导入组件 ___ babel-plugin-root-import

    在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,经常不记得这是多深,有没有一个插件,能自动帮我们解决这样的问题? 使用指南 我们使用的目标要达到以下的 ...

  8. python项目导出所需要的依赖库

    使用pip freeze $ pip freeze > requirements.txt 这种方式是把整个环境中的包都列出来了,如果是虚拟环境可以使用. 通常情况下我们只需要导出当前项目的req ...

  9. 怎么在myeclipse中导入已经写好的项目

    经常我们需要学习别人写好了的源码来提升自己的编码能力,本文将介绍如何从外部导入别人已经写好的项目到我们myeclipse里面.同时也将介绍怎么给导入的工程改名的问题.                 ...

随机推荐

  1. rsyslog和logrotate服务

    参考: http://www.lampbo.org/others/opensource/rsyslog-config-file-detail.html http://bangerlee.blog.ch ...

  2. Linux 之 rsyslog 系统日志转发

    一.rsyslog 介绍 ryslog 是一个快速处理收集系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多种来源输入输出转换结果到目的地,据官网介绍 ...

  3. Vue2 第一天学习

    个人小总结:1年多没有写博客,感觉很多知识点生疏了,虽然工作上能解决问题,但是当别人问到某个知识点的时候,还是迷迷糊糊的,所以坚持写博客是硬道理的,因为大脑不可能把所有的知识点记住,有可能某一天忘了, ...

  4. Mysql windows版本的安装

    一.mysql官网下载 下载安装包 MySQL Community Server (GPL)--> 选用zip版本的 二.安装 解压mysql的安装包. 将bin目录配置到环境变量中.(即环境变 ...

  5. Maven学习笔记-03-Eclipse和Maven集成

    本文使用 Eclipse 集成 Maven,并创一个基于 maven的web工程 一 环境版本信息 本文使用的版本信息如下: Eclipse Version: Mars.1 Release (4.5. ...

  6. Luogu3067 平衡的奶牛群 Meet in the middle

    题意:给出$N$个范围在$[1,10^8]$内的整数,问有多少种取数方案使得取出来的数能够分成两个和相等的集合.$N \leq 20$ 发现爆搜是$O(3^N)$的,所以考虑双向搜索. 先把前$3^\ ...

  7. 「Fluent Python」今年最佳技术书籍

    Fluent Python 读书手记 Python数据模型:特殊方法用来给整个语言模型特殊使用,一致性体现.如:__len__, __getitem__ AOP: zope.inteface 列表推导 ...

  8. Oracle数据库重做日志及归档日志的工作原理说明

    Oracle数据库重做日志及归档日志的工作原理: lgwr进程将redo log buffer中的重做数据写入到redo log中,此时的redo log分组,每当一个redo log group写满 ...

  9. Redis常用操作-------Key(键)

    1.DEL key [key ...] 删除给定的一个或多个 key . 不存在的 key 会被忽略. 可用版本: >= 1.0.0 时间复杂度: O(N), N 为被删除的 key 的数量. ...

  10. linux-IO重定向-文本流重定向

    输出重定向的追加和覆盖 标准输出就这两种: 覆盖和追加 >> 是重定向操作符 1 是 命令的文件描述符 重定向操作符合文件描述符之间不能存在空白符 否则1会被当做是文件被读取 将正确和错误 ...