引发 KeyError(key) 异常,没有特定的异常信息。

5
我收到了一个错误信息,但是不知道该怎么处理。下面是显示的错误信息。我已经下载了所有必要的工具来运行它,但是似乎有问题与密钥有关。我已经正确地输入了它们,但为了保护我的账户隐私,我已经将账户用户名和密码替换为隐藏。谢谢您提前的帮助。
C:\Users\User\Downloads\real-time-intrinio-python-master\real-time-intrinio-python-master> python realtime.py AAPL 
Using Ticker: AAPL 
Traceback (most recent call last):
  File "realtime.py", line 18, in <module>
     r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode(os.environ['myUsername'] + ":" + os.environ['myPassword'])}) 
  File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
     raise KeyError(key) from None 
KeyError: 'myUsername'

这是我正在使用的代码,第18行是“r=requests.get(auth_url, headers...”。
import websocket
import _thread
import time
import requests
import base64
import json
import sys
import os
from requests.auth import HTTPBasicAuth

try:
    print ("Using Ticker: " + str(sys.argv[1]))
except:
    print ("Please include ticker as first argument")
    sys.exit()

auth_url = "https://realtime.intrinio.com/auth";
r=requests.get(auth_url, headers={"Authorization": "Basic %s" % base64.b64encode(os.environ['7641353c8540cd7c795c96f097185c26'] + ":" + os.environ['c15d32295cf254ab57d5523c5bf95f80'])})

socket_target = "wss://realtime.intrinio.com/socket/websocket?token=%s" % (r.text)

def on_message(ws, message):
    try:
        result = json.loads(message)
        print (result["payload"])
    except:
        print (message)

def on_error(ws, error):
    print ("###ERROR### " + error)

def on_close(ws):
    print ("###CONNECTION CLOSED###")

def on_open(ws):
    def run(*args):
        security = "iex:securities:" + str(sys.argv[1]).upper()
        message = json.dumps({"topic": security,"event": "phx_join","payload": {},"ref": "1"})
        ws.send(message)
    thread.start_new_thread(run, ())


websocket.enableTrace(True)
ws = websocket.WebSocketApp(socket_target, on_message = on_message, on_error = on_error, on_close = on_close)
ws.on_open = on_open
ws.run_forever()

3
基本上这句话的意思是操作系统中分配给'myUsername''myPassword'的环境变量尚未设置。在cmd终端上,尝试输入echo %myUsername%echo %myPassword% - chickity china chinese chicken
为了纠正@downshift指出的错误,在cmd提示符下,您需要set myUsername=something(和/或set myPassword=somethingelse),这将暂时设置它们。要在Windows上永久设置它们,您可以定义环境变量及其值是“设置|控制面板|系统|高级系统设置”中的“环境变量...”按钮。 - martineau
感谢您的回复。很抱歉,我是Python和设置环境变量的完全新手。我想永久设置这个变量,那么我需要将其设置为“用户变量”还是“系统变量”?另外,我只需添加新的变量名为myUsername,变量值为“32rqwefrwaf33f”吗?还是需要创建一个单独的文档? - Lasheen Lartey
我已经解决了,不用担心,谢谢。 - Lasheen Lartey
1个回答

1

总结并补充一下。

正如chickity所指出的那样,您需要设置环境变量。这可以通过Python或CMD/终端完成。

# Set environment variables
os.environ['myUsername'] = 'username'
os.environ['myPassword'] = 'secret'

然而,通过脚本实现这一点可能会导致潜在的致命错误,即将您的机密/密码添加到git中。因此,建议通过CMD来完成此操作。要永久添加环境变量,请使用setx命令。有关更多详细信息和注意事项,请参见此帖子

setx myUsername username
setx myPassword secret

完成此操作后,您可以将第18行更改为:
# Get environment variables and create request
USER = os.getenv('myUsername')
PASSWORD = os.environ.get('myPassword')
token = base64.b64encode(f"{USER}:{PASSWORD}")
r=requests.get(auth_url, headers={"Authorization": f"Basic {token}"})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接