zoukankan      html  css  js  c++  java
  • 关于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证明“真理再前进一步就是谬误”
    senior developer in Hongkong
    Emacs 维基百科,自由的百科全书
    深入C(和C++)
    图灵等价和图灵完备
    2012年中国大陆和香港的工资收入水平市场调查报告
    图灵完备
    linux中vi进行字符替换_井底之蛙_百度空间
    they're hiring
    Linux下游戏大作赏析(三)
  • 原文地址:https://www.cnblogs.com/piperck/p/5891251.html
Copyright © 2011-2022 走看看