如何在不重新 运行 函数 (python) 的情况下将值从一个脚本中的函数传输到另一个脚本?
How to transfer a value from a function in one script to another script without re-running the function (python)?
总的来说,我对编程真的很陌生,也没有什么经验,我正在学习 python,因为我认为它比其他语言更简单。无论如何,我正在尝试将 Flask-Ask 与 ngrok 结合使用来编写 Alexa 技能以在线检查数据(每小时更改几次)。该脚本采用四个不同的数字(来自不同的 URL)并将其组织成一个字典,并使用 Selenium 和 phantomjs 来访问数据。
显然,这超过了 8-10 秒的最大 运行 时间,Alexa 决定它花费的时间太长并且 returns 一条错误消息(我知道它超时为 ngrok 和python 日志会显示是否发生实际错误,它总是在 8-10 秒后发生,即使在 8-10 秒后它应该在脚本的中间)。我读到过我可以重新提示它,但我不知道怎么做,那只会再给我 8-10 秒,而脚本通常需要大约 25 秒才能从互联网上获取数据(然后也许一秒钟把它变成字典)。
我尝试将 getData 函数放在 运行s 首次调用 Alexa 技能时的意图之后,但它仅在 运行s 当我初始化本地服务器并仅保存数据时对于每个新的 Alexa 会话。因为数据经常变化,所以我希望每次我用 Alexa 启动新的技能会话时它都执行该功能。
所以,我决定将实际获取数据的功能外包给另一个脚本,并使另一个脚本 运行 不断循环。这是我使用的代码。
import time
def getData():
username = '' #username hidden for anonymity
password = '' #password hidden for anonymity
browser = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs')
browser.get("https://gradebook.com") #actual website name changed
browser.find_element_by_name("username").clear()
browser.find_element_by_name("username").send_keys(username)
browser.find_element_by_name("password").clear()
browser.find_element_by_name("password").send_keys(password)
browser.find_element_by_name("password").send_keys(Keys.RETURN)
global currentgrades
currentgrades = []
gradeids = ['2018202', '2018185', '2018223', '2018626', '2018473', '2018871', '2018886']
for x in range(0, len(gradeids)):
try:
gradeurl = "https://www.gradebook.com/grades/"
browser.get(gradeurl)
grade = browser.find_element_by_id("currentStudentGrade[]").get_attribute('innerHTML').encode('utf8')[0:3]
if grade[2] != "%":
grade = browser.find_element_by_id("currentStudentGrade[]").get_attribute('innerHTML').encode('utf8')[0:4]
if grade[1] == "%":
grade = browser.find_element_by_id("currentStudentGrade[]").get_attribute('innerHTML').encode('utf8')[0:1]
currentgrades.append(grade)
except Exception:
currentgrades.append('No assignments found')
continue
dictionary = {"class1": currentgrades[0], "class2": currentgrades[1], "class3": currentgrades[2], "class4": currentgrades[3], "class5": currentgrades[4], "class6": currentgrades[5], "class7": currentgrades[6]}
return dictionary
def run():
dictionary = getData()
time.sleep(60)
那个脚本 运行 一直在执行我想要的,但是在我的其他脚本中,我不知道如何调用字典变量。当我使用
from getdata.py import dictionary
在 Flask-ask 脚本中,它只是 运行 循环并不断获取数据。我只是想让 Flask-ask 脚本获取 "run" 函数中定义的变量,然后在没有 运行 getdata 脚本中定义的任何实际脚本的情况下使用它,这些脚本已经 运行 并得到正确的数据。如果重要的话,这两个脚本都在 MacBook 的终端中 运行ning。
有什么方法可以解决我所问的问题,或者有更简单的解决方法吗?感谢任何和所有帮助!
听起来你想导入函数,所以你可以运行;而不是导入字典。
尝试删除 run
函数,然后在您的其他脚本中删除
from getdata import getData
然后每次你写 getData()
它会 运行 你的代码并得到一个新的最新字典。
这是你问的吗?
此问题已解决。
至于原来的问题,我没弄清楚如何让它只导入字典而不是先 运行 生成字典的函数。此外,我意识到必须有一个比不断 运行 这样的脚本更实用的解决方案,即使这样也得不到全新的数据。
我的解决方案是让获取数据的脚本与启动函数同时启动 运行。这是第一个意图的最终脚本(其余部分保持不变):
@ask.intent("start_skill")
def start_skill():
welcome_message = 'What is the password?'
thread = threading.Thread(target=getData, args=())
thread.daemon = True
thread.start()
return question(welcome_message)
def getData():
#script to get data here
#other intents and rest of script here
根据设计,该技能要求输入数字密码以确保我是使用它的人,然后它才愿意读取数据(这可能毫无意义,但出于我自己的教育原因,这项技能至少也是如此至于实际原因,所以,为了额外的练习,我希望它具有尽可能多的功能)。因此,当您真正能够请求数据时,获取数据的脚本将完成 运行(我已经测试过它,它似乎可以正常工作)。
总的来说,我对编程真的很陌生,也没有什么经验,我正在学习 python,因为我认为它比其他语言更简单。无论如何,我正在尝试将 Flask-Ask 与 ngrok 结合使用来编写 Alexa 技能以在线检查数据(每小时更改几次)。该脚本采用四个不同的数字(来自不同的 URL)并将其组织成一个字典,并使用 Selenium 和 phantomjs 来访问数据。
显然,这超过了 8-10 秒的最大 运行 时间,Alexa 决定它花费的时间太长并且 returns 一条错误消息(我知道它超时为 ngrok 和python 日志会显示是否发生实际错误,它总是在 8-10 秒后发生,即使在 8-10 秒后它应该在脚本的中间)。我读到过我可以重新提示它,但我不知道怎么做,那只会再给我 8-10 秒,而脚本通常需要大约 25 秒才能从互联网上获取数据(然后也许一秒钟把它变成字典)。
我尝试将 getData 函数放在 运行s 首次调用 Alexa 技能时的意图之后,但它仅在 运行s 当我初始化本地服务器并仅保存数据时对于每个新的 Alexa 会话。因为数据经常变化,所以我希望每次我用 Alexa 启动新的技能会话时它都执行该功能。
所以,我决定将实际获取数据的功能外包给另一个脚本,并使另一个脚本 运行 不断循环。这是我使用的代码。
import time
def getData():
username = '' #username hidden for anonymity
password = '' #password hidden for anonymity
browser = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs')
browser.get("https://gradebook.com") #actual website name changed
browser.find_element_by_name("username").clear()
browser.find_element_by_name("username").send_keys(username)
browser.find_element_by_name("password").clear()
browser.find_element_by_name("password").send_keys(password)
browser.find_element_by_name("password").send_keys(Keys.RETURN)
global currentgrades
currentgrades = []
gradeids = ['2018202', '2018185', '2018223', '2018626', '2018473', '2018871', '2018886']
for x in range(0, len(gradeids)):
try:
gradeurl = "https://www.gradebook.com/grades/"
browser.get(gradeurl)
grade = browser.find_element_by_id("currentStudentGrade[]").get_attribute('innerHTML').encode('utf8')[0:3]
if grade[2] != "%":
grade = browser.find_element_by_id("currentStudentGrade[]").get_attribute('innerHTML').encode('utf8')[0:4]
if grade[1] == "%":
grade = browser.find_element_by_id("currentStudentGrade[]").get_attribute('innerHTML').encode('utf8')[0:1]
currentgrades.append(grade)
except Exception:
currentgrades.append('No assignments found')
continue
dictionary = {"class1": currentgrades[0], "class2": currentgrades[1], "class3": currentgrades[2], "class4": currentgrades[3], "class5": currentgrades[4], "class6": currentgrades[5], "class7": currentgrades[6]}
return dictionary
def run():
dictionary = getData()
time.sleep(60)
那个脚本 运行 一直在执行我想要的,但是在我的其他脚本中,我不知道如何调用字典变量。当我使用
from getdata.py import dictionary
在 Flask-ask 脚本中,它只是 运行 循环并不断获取数据。我只是想让 Flask-ask 脚本获取 "run" 函数中定义的变量,然后在没有 运行 getdata 脚本中定义的任何实际脚本的情况下使用它,这些脚本已经 运行 并得到正确的数据。如果重要的话,这两个脚本都在 MacBook 的终端中 运行ning。
有什么方法可以解决我所问的问题,或者有更简单的解决方法吗?感谢任何和所有帮助!
听起来你想导入函数,所以你可以运行;而不是导入字典。
尝试删除 run
函数,然后在您的其他脚本中删除
from getdata import getData
然后每次你写 getData()
它会 运行 你的代码并得到一个新的最新字典。
这是你问的吗?
此问题已解决。
至于原来的问题,我没弄清楚如何让它只导入字典而不是先 运行 生成字典的函数。此外,我意识到必须有一个比不断 运行 这样的脚本更实用的解决方案,即使这样也得不到全新的数据。
我的解决方案是让获取数据的脚本与启动函数同时启动 运行。这是第一个意图的最终脚本(其余部分保持不变):
@ask.intent("start_skill")
def start_skill():
welcome_message = 'What is the password?'
thread = threading.Thread(target=getData, args=())
thread.daemon = True
thread.start()
return question(welcome_message)
def getData():
#script to get data here
#other intents and rest of script here
根据设计,该技能要求输入数字密码以确保我是使用它的人,然后它才愿意读取数据(这可能毫无意义,但出于我自己的教育原因,这项技能至少也是如此至于实际原因,所以,为了额外的练习,我希望它具有尽可能多的功能)。因此,当您真正能够请求数据时,获取数据的脚本将完成 运行(我已经测试过它,它似乎可以正常工作)。