未找到文件 (.json)

FILE (.json) NOT FOUND

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

我正在开发一个 flask 项目来创建 rest API,并且我有一个 JSON 凭证文件(google 视觉文件),但是当我 运行 它说找不到文件的代码,即使它在同一目录中。我已经为这个特定项目激活了一个 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() 

这可能是因为 Python 进程的 "working folder" 与文件所在的位置不同。有一个小的(尽管很复杂)生成文件名的方法,它总是有效的:

  1. 使用 __file__ 获取调用它的 Python 文件的文件名。
  2. 使用 os.path.dirname
  3. 从该路径中删除文件名
  4. 使用 os.path.join
  5. 附加您要打开的文件名
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 文件放置在应用程序中应记录的某个位置,因为您仍然无法将其添加到源代码(可能是具有默认值的示例文件)。