如何将值从一个脚本中的函数传递到另一个脚本而不重新运行该函数(python)?

问题描述 投票:0回答:2

我对编程很新,而且非常缺乏经验,而且我正在学习python,因为我觉得它比其他语言更简单。无论如何,我正在尝试使用带有ngrok的Flask-Ask来编程Alexa技能来在线检查数据(每小时更改几次)。该脚本采用四个不同的数字(来自不同的URL)并将其组织成字典,并使用Selenium和phantomjs来访问数据。

显然,这超过了意图的8-10秒最大运行时间,然后Alexa决定它花了太长时间并返回错误消息(我知道它的时间输出为ngrok而python日志会显示是否发生了实际错误,并且它总是8-10秒后发生,即使在8-10秒之后它应该在剧本的中间)。我已经读过,我可以重新谴责它,但我不知道怎么样,这只会给我8-10秒,而脚本通常需要大约25秒才能从互联网上获取数据(然后可能一秒钟把它变成字典)。

我尝试将getData函数放在首次调用Alexa技能后运行的intent之后,但它只在我初始化本地服务器并且只保存每个新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)

该脚本不断运行并执行我想要的操作,但是在我的其他脚本中,我不知道如何调用字典变量。当我在Flask-ask脚本中使用from getdata.py import dictionary时,它只运行循环并不断获取数据。我只想让Flask-ask脚本获取“run”函数中定义的变量,然后使用它而不运行getdata脚本中定义的任何实际脚本,这些脚本已经运行并获得了正确的数据。如果重要,两个脚本都在MacBook上的终端上运行。

有什么方法可以做我正在询问的问题,还是有更简单的解决方法?任何和所有的帮助表示赞赏!

python flask transfer
2个回答
0
投票

听起来你想导入这个功能,所以你可以运行它;而不是导入字典。

尝试删除run函数,然后在您的其他脚本中

from getdata import getData

然后每次你写getData()它将运行你的代码并获得一个新的最新字典。

这是你在问什么?


0
投票

此问题已得到解决。

至于原始问题,我没有想出如何使它只是导入字典而不是首先运行函数来生成字典。此外,我意识到必须有一个更实际的解决方案,而不是经常运行这样的脚本,甚至没有得到全新的数据。

我的解决方案是使得获取数据的脚本在启动功能的同时开始运行。这是第一个意图的最终脚本(其余部分保持不变):

@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

根据设计,技能要求使用数字密码以确保我在使用它之前愿意读取数据(这可能毫无意义,但这种技能至少与我自己的教育原因一样多,因为实际原因,因此,对于额外的练习,我希望它拥有尽可能多的功能。因此,当您实际上能够请求数据时,获取数据的脚本将完成运行(我已经测试了这个并且它似乎可以正常工作)。

© www.soinside.com 2019 - 2024. All rights reserved.