为什么这个外部 Python 脚本不在其本地目录中读取?



前几天我在做一些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

如果我在urldata被分配的行中对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()读取整个文件两次,那将会好得多。

最新更新