无法在 Flask 应用程序中加载文件

Unable to load a file in flask application

我们有一个 flask 应用程序,我们需要使用 gensim 加载位于路径 '/root/apps/mlapi/resources/emoji2vec.bin' 的预训练模型。虽然 运行 我得到的代码低于错误

File "mlapi.py", line 26, in <module>
    e2v_model = ModelEmoji2Vec()
  File "/home/atinesh/Downloads/Current/vnc_chat/apps2/mlapi/models/susheels/text2emoji/vector_model/modelE2V.py", line 19, in __init__
    self.e2v = gsm.KeyedVectors.load_word2vec_format(emoji2vec_path, binary=True)
  File "/home/atinesh/Downloads/Current/vnc_chat/vnc_env/lib/python3.6/site-packages/gensim/models/keyedvectors.py", line 1498, in load_word2vec_format
    limit=limit, datatype=datatype)
  File "/home/atinesh/Downloads/Current/vnc_chat/vnc_env/lib/python3.6/site-packages/gensim/models/utils_any2vec.py", line 342, in _load_word2vec_format
    with utils.open(fname, 'rb') as fin:
  File "/home/atinesh/Downloads/Current/vnc_chat/vnc_env/lib/python3.6/site-packages/smart_open/smart_open_lib.py", line 308, in open
    errors=errors,
  File "/home/atinesh/Downloads/Current/vnc_chat/vnc_env/lib/python3.6/site-packages/smart_open/smart_open_lib.py", line 517, in _shortcut_open
    return _builtin_open(parsed_uri.uri_path, mode, buffering=buffering, **open_kwargs)
PermissionError: [Errno 13] Permission denied: '/root/apps/mlapi/resources/emoji2vec.bin'

基本上,错误发生在

#modelE2V.py, line 19
self.e2v = gsm.KeyedVectors.load_word2vec_format(emoji2vec_path, binary=True)

它说权限被拒绝。但是,如果我尝试使用 Flask 应用程序外部的简单 python 脚本加载模型,它工作正常,为什么这个错误发生在 Flask 应用程序内部

您运行遇到文件权限错误。这意味着试图访问您的文件的 unix 用户没有所需的权限。

您似乎将预训练模型文件存储在 /root/apps/mlapi/resources/emoji2vec.bin

这看起来像是需要 root 或 sudo 权限才能访问的位置。 验证这个运行

ls -l /root/apps/mlapi/resources/emoji2vec.bin

输出可能类似于:

-rw-rw---- 1 root root 6 Dec 29 XX:XX /root/apps/mlapi/resources/emoji2vec.bin

这表示只有root组中的用户可以读写(rw)文件,也就是只有root用户可以读写文件。

当您将 sudo 前置到命令时,您将更改为 root 用户,然后以该 root 用户身份执行命令的其余部分。所以 运行 使用 sudo 连接 python 脚本意味着 root 用户将执行脚本,因为 root 用户可以访问 /root/apps/mlapi/resources/emoji2vec.bin 脚本将 运行 没有问题。

然而,当您 运行 烧瓶时,您 运行 将它与不同的用户连接。在您的开发箱(您的计算机)上,unix 用户 运行ning flask 很可能是 atinesh.

所以基本的解决方案是修改 /root/apps/mlapi/resources/emoji2vec.bin 的权限,由 atinesh 拥有或至少读取。

@furas 在评论中指出,如您在此处所做的那样,在 /root/ 中安装资源通常是个坏主意,我同意。

最佳解决方案是: 重新定位您的文件并更改权限。

mkdir /home/atinesh/Downloads/Current/vnc_chat/apps2/mlapi/resources
sudo cp /root/apps/mlapi/resources/emoji2vec.bin /home/atinesh/Downloads/Current/vnc_chat/apps2/mlapi/resources/emoji2vec.bin
sudo chown atinesh:atinesh /home/atinesh/Downloads/Current/vnc_chat/apps2/mlapi/resources/emoji2vec.bin

如果您设置为不重新定位文件,您可以更改现在的权限:

sudo chown atinesh:atinesh /root/apps/mlapi/resources/emoji2vec.bin

顺便说一句,在生产环境中,创建一个名为 "app"(或类似的名称)的新 unix 用户可能是明智的,然后只给用户 "app" 权限到一个单一的包含烧瓶代码的文件夹。这可以防止您的应用程序代码触及您不希望它触及的文件。此外,如果您的烧瓶应用程序以某种方式受到损害,攻击者将只有 "app" 用户的权限。