关于python项目路径导入自己写的库出错的一点思考
其实也是在写自己项目的时候遇到的,以前也遇到了但是一直采取的是回避的策略,这次总算弄清楚所以总结一下。
这个项目的顶级目录是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项目路径导入自己写的库出错的一点思考的更多相关文章
- Pycharm 项目无法导入自己写的模块(问题记录贴)
问题背景: 从外部导入一个Python项目后,发现包错误,如图: 解决步骤: 1.将目录下的"5-6——apriori.py"复制一份,重命名为”apriori.py": ...
- python 相对路径导入 与 绝对路径导入
我的理解: 假设有一个文件夹 app 若 app 下有app/__init__.py文件,则此 app 被视作一个 package,而 app 下的其他文件/文件夹被视作 module 我们知道,pa ...
- react-native 相对项目路径导入组件
在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,如果目录多了一长串,书写很烦,看着也不好看. 方法一: 例如你想引入utils里面的文件,不想../. ...
- react-native 相对项目路径导入组件 ___ babel-plugin-module-resolver
babel-plugin-module-resolver 是一个Babel模块解析插件, 在.babelrc中可以配置模块的导入搜索路径. 为模块添加一个新的解析器.这个插件允许你添加新的" ...
- python之路径导入
问题: 最近在学习import的时候,发现不像import xxx,或者from xxx import ooo 这样简单.比如,看下面这个图: 要导入才能在te.py调用pre.tab.py?? 直接 ...
- python 根据路径导入模块
Import python module NOT on path http://stackoverflow.com/questions/10161568/import-python-module-no ...
- react-native 相对项目路径导入组件 ___ babel-plugin-root-import
在使用react-native的时候,经常要自定义很多组件,但是只能使用../../../的方式,经常不记得这是多深,有没有一个插件,能自动帮我们解决这样的问题? 使用指南 我们使用的目标要达到以下的 ...
- python项目导出所需要的依赖库
使用pip freeze $ pip freeze > requirements.txt 这种方式是把整个环境中的包都列出来了,如果是虚拟环境可以使用. 通常情况下我们只需要导出当前项目的req ...
- 怎么在myeclipse中导入已经写好的项目
经常我们需要学习别人写好了的源码来提升自己的编码能力,本文将介绍如何从外部导入别人已经写好的项目到我们myeclipse里面.同时也将介绍怎么给导入的工程改名的问题. ...
随机推荐
- oracle12C 创建PDB
1.根据数据库现有模板创建PDB CREATE PLUGGABLE DATABASE ssptrad ADMIN USER sspIDENTIFIED BY oracle roles=(dba) fi ...
- Emoji表情符号在MySQL数据库中的存储
文章转自https://www.jianshu.com/p/20740071d854 在Android手机或者iPhone的各种输入法键盘中,会自带一些Emoji表情符号,如IPhone手机系统键盘包 ...
- Java连接Redis之redis的增删改查
一.新建一个maven工程,工程可以以jar的形式或war都行,然后导入正确的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0& ...
- ubuntu16.04设置tomcat自启动
我的tomcat名字叫tomcat8_product 1.拷贝catalina.sh到/etc/init.d/目录下 cd tomcat8_product/bin/catalina.sh /etc/i ...
- MongoDB可视化工具--Robo 3T 使用教程
MongoDB可视化工具--Robo 3T 使用教程 1. 到官网下载Robo 3T,网址如: https://robomongo.org/download. 2. 下载安装成功后,打开后点击左上角的 ...
- 【Topcoder 10524】BrickPuzzle
Topcoder 10524 题意:给一个\(n\times m\)的棋盘,上面有一些格子是白色的,需要被一些俄罗斯方块们覆盖,俄罗斯方块有\(4\)种: 然后这些图案不能重叠或超出边界,并且每一个图 ...
- java 学习------JDK1.8安装与配置
1.下在JDK 1.8 2.解压安装 (一般选择默认路径安装) 3.配置环境变量 (我的电脑是windows10 系统) (1)计算机→属性→高级系统设置→高级→环境变量 (2)添加 JAVA ...
- 【SQL】MaxComputer中调试与问题排查技巧小结
1.分段调试 面对长的SQL,出错时一般直接看定位的行号,有时候不出错但是没数据时,应该尝试分段调试,很长的SQL嵌套很多的子查询时,一个一个子查询进行分别调试,看哪一步子查询出了问题,层层推进 2. ...
- vim命令记录
最近开始用vim作为日常编辑器,由于vim的命令过多,现在记录一下
- 解密自动CPS变换
7.2 1 前言 我最一开始听到 CPS 变换这个词是在王垠的博客里 (请求不要喷我),就是那篇他第一次宣传他的40行代码的文章. 我当时什么都看不懂,所以没太注意,不过我也正在学程序语言方面的东西, ...