前几天我在做一些API的东西,在python中遇到了这个(可能)奇怪的行为。基本上,我在秘密文件夹./secret_stuff/token_request.py
中有一个脚本,它构造并返回一个新的API访问令牌。看起来像这样
token_request.py
import json
import requests
def generate_token():
url = json.load(open('./secrets.json'))['endpoints']['token'] # reads and stores relevant endpoint for token request from supporting file
data = json.load(open('./secrets.json'))['token_request_data'] # loads token request data from supporting file
r = requests.post(url=url, params=data).json()
return r['access_token']
if __name__ == '__main__':
generate_token()
当我使用CLI执行它时,它运行得很好…
我导入外部脚本作为一个模块,然后在我的实际程序的顶部实例化它,与api/data等一起工作。
api_ingestor.py
import json
import re
import requests
import secret_stuff.token_request as tr
token = tr.generate_token()
endpoint = json.load(open('./secret_stuff/secrets.json'))['endpoints']['KeyMessageData']
并从tr.generate_token()
调用中抛出FileNotFound
错误,它将url
分配为其本地目录中的.json
文件中的端点,这是整个项目的子目录。
目录结构如下:
|
|
/secrets
| |
| |
| --secrets.json
| |
| --token_request.py
|
api_ingestor.py
如果我在url
和data
被分配的行中对token_request.py
进行此更改:
def generate_token():
url = json.load(open('./secret_stuff/secrets.json'))['endpoints']['token'] # reads and stores relevant endpoint for token request from supporting file
data = json.load(open('./secret_stuff/secrets.json'))['token_request_data'] # loads token request data from supporting file
那么它在api_ingestor.py
工作!没有FileNotFound
错误!
但是现在当运行CLI时,它不能自己工作,因为在本地目录中没有子目录。
有人想要或能够解释这种行为给我吗?
文件位置将取决于当前工作目录的时候执行。使用以下命令使其始终使用脚本所在的目录:
import os
secret_file = os.path.join(os.path.dirname(__file__), "secrets.json")
url = json.load(open(secret_file))['endpoints']['token'] # reads and stores relevant endpoint for token request from supporting file
data = json.load(open(secret_file))['token_request_data'] # loads token request data from supporting file
这将使用脚本所在的目录,而不是当前的工作目录。
如果将JSON读取到一个结构中并分别从中提取元素,而不是让JSON .load()读取整个文件两次,那将会好得多。