【问题标题】:Cannot find the path of my model in flask在烧瓶中找不到我的模型的路径
【发布时间】:2019-12-03 14:12:04
【问题描述】:

我的目录结构如下:

- project
  - server.py
  - test-model (dir)

我的脚本如下所示:

@app.route("/spacy/entities", methods=['GET', 'POST'])
def spacy_entities():
    import spacy
    nlp = spacy.load('test-model')   // also tried './test-model'

找不到模型“测试模型”。它似乎不是快捷链接、Python 包或数据目录的有效路径。

我在 vagrant 中运行这个脚本。

vagrant@homestead:~/Code/sideprojects/project$ pwd
/home/vagrant/Code/sideprojects/project

我尝试过的事情:

1. os.path.realpath('.') -> /home/vagrant/Code
2. os.path.realpath(__file__) -> /home/vagrant/Code/server.py
3. os.path.dirname(os.path.realpath(__file__)) -> /home/vagrant/Code

但它应该是 /home/vagrant/Code/sideprojects/project 以便它可以找到“测试模型”。我做错了什么?

(我试图避免放置硬编码路径)

编辑:我试过了:

path = os.path.dirname(os.path.realpath(__file__)) + '/sideprojects/project'
nlp = spacy.load(path + "/test-model")

找不到模型“/home/vagrant/Code/sideprojects/project/test-model”。它似乎不是快捷链接、Python 包或数据目录的有效路径。

完整的错误是:

文件“server.py”,第 40 行,在 spacy_entities nlp = spacy.load(路径 + "/goal1") 文件“/home/vagrant/.local/lib/python3.6/site-packages/spacy/init.py”,第 30 行,加载中 return util.load_model(name, **overrides) 文件“/home/vagrant/.local/lib/python3.6/site-packages/spacy/util.py”,第 169 行,在 load_model 引发 IOError(Errors.E050.format(name=name))

OSError: [E050] 找不到模型“/home/vagrant/Code/sideprojects/project/test-model”。它似乎不是快捷链接、Python 包或数据目录的有效路径。

【问题讨论】:

  • 如果你正在运行 server.py 来运行烧瓶服务器,那么它应该可以工作,否则给出来自项目基础根目录的路径,例如,spacy.load('project/test-model')
  • 但是我会错过/sideprojects 部分,如果我最终输入'sideprojects/project/test-model',不是吗?有什么方法可以说getpath(./test-model') 之类的吗?目前我以python3 server.py 运行它,但最终我想与 nohup 一起使用,并且我不希望它在未来变得混乱/硬编码(或者即使我将它部署到服务器)
  • 在这种情况下,编写一个加载 spacy 模型的函数并返回加载的 nlp 对象并在这条路线上调用该对象,我简单来说,编写一个函数来完美地加载 ner 模型与您的项目架构,然后在路由中调用该对象,如 nlp = load_model()
  • @temmo 我添加了一个编辑,但即使使用(部分)硬编码路径仍然无法使其工作。顺便说一句,我是 python 菜鸟 - 你能指导我理解你的意思吗?
  • 非常感谢!我让它工作了。如果您添加答案,我可以接受它

标签: python flask


【解决方案1】:

创建一个新的py文件说modelload.py然后在里面创建一个函数说load_model在这个函数中加载spacy模型

示例代码

# modelload.py
# just make a script which load model and make a function to it 

import spacy
model_path = 'test-model' # modifed this to your path and check if this is working fine and load correctly

def load_model(path=None):
    if path is None:
          path = model_path

    nlp = spacy.load(path)
    return nlp


# end

在您的路由脚本/server.py 文件中将此模型导入为这样的对象

# server.py

@app.route("/spacy/entities", methods=['GET', 'POST'])
def spacy_entities():
    from modelload import load_model
    nlp = load_model() 
    """give other model names if you want to laod new model 
      by default it is `test-model`"""

【讨论】:

  • 再次感谢:P.S:我用过model_path = os.path.dirname(os.path.realpath(__file__)) + '/test-model'
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 2021-01-18
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多