【问题标题】:FILE (.json) NOT FOUND未找到文件 (.json)
【发布时间】:2019-11-26 08:45:00
【问题描述】:

这是我激活虚拟环境的目录:

我正在开发一个烧瓶项目来创建一个 REST API,并且我有一个 JSON 凭证文件(google vision 文件),但是当我运行代码时,它说文件未找到,即使它位于同一目录中。我已经为这个特定项目激活了一个 virtualenv。 mainone.py 是我要运行的代码。

这是我得到的错误:

"File {} was not found.".format(filename)
google.auth.exceptions.DefaultCredentialsError: File date_scanner.json was not found. 

这是我用来访问特定文件的代码块:

from flask import Flask,request,jsonify
import os,io,re,glob,base64
from google.cloud import vision
from google.cloud.vision import types
from PIL import Image

os.environ['GOOGLE_APPLICATION_CREDENTIALS']=r'date_scanner.json'
client=vision.ImageAnnotatorClient() 

【问题讨论】:

  • 尝试使用完整路径,例如 "D:\\python\\path\\to\\file.json"

标签: python json python-requests ocr google-vision


【解决方案1】:

这可能是因为 Python 进程的“工作文件夹”与文件所在的位置不一样。有一种小(虽然复杂)的方式来生成文件名,它总是有效的:

  1. 使用 __file__ 获取调用它的 Python 文件的文件名。
  2. 使用os.path.dirname从该路径中去除文件名
  3. 附加要使用os.path.join 打开的文件名
from os.path import dirname, join


def get_filename(filename):
    here = dirname(__file__)
    output = join(here, filename)
    return output

一些值得深思的食物

但是,在这种情况下,您应该注意以下几点:该文件包含安全凭据,并且应该存在于您的源代码中。所以虽然上面的例子可以解决眼前的问题,但应该解决这个问题的安全性。

最好的方法是将凭证文件的文件名外部化到配置文件中。说,例如,您将使用 .ini 文件作为配置文件,您的代码中可能会有这样的内容:

config = configparser.ConfigParser()
config.read('config.ini')
vision_creds_file = config.get('google_vision', 'filename')

然后将以下内容放入config.ini:

[google_vision]
filename = /path/to/filename.json

这仍然需要您将 config.ini 文件放在应记录在应用程序中的某个位置,因为您仍然无法将其添加到源代码(可能是具有默认值的示例文件)。

【讨论】:

  • 感谢您的回复:),但是我在问题中发布了一个图片链接,请检查一次。
  • 我确实检查了图片链接。上面的代码仍然是正确的。我还在答案中添加了一些有关安全问题的详细信息。
  • 对此我非常感激,我是使用 google ocr 和使用不同库制作项目的新手,所以我不太明白你在第二部分中关于安全问题的意思。但是我会跟进的。非常感谢
  • 可以这样总结:您永远不应该将访问凭据视为代码的一部分。它们不应与您的代码一起分发。安装应用程序时,应在单独的文件中创建凭据文件想象为具有不同凭据的不同用户安装两次相同的应用程序。这应该总是可行的。如果凭据文件是您的代码的一部分,这将不起作用。
  • 非常感谢您抽出宝贵时间进行解释,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2020-11-27
  • 1970-01-01
  • 2019-10-21
相关资源
最近更新 更多