首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不重新运行函数(python)的情况下将值从一个脚本中的函数转移到另一个脚本中?

如何在不重新运行函数(python)的情况下将值从一个脚本中的函数转移到另一个脚本中?
EN

Stack Overflow用户
提问于 2017-12-25 06:58:19
回答 2查看 103关注 0票数 0

我对一般的编程都是新手,经验也很少,我正在学习python,因为我认为它比其他语言更简单。无论如何,我正在尝试使用Flask-Ask和ngrok来编写Alexa在线检查数据的技能(它每小时更改几次)。该脚本接受四个不同的数字(来自不同的URL),并将其组织到一个字典中,并使用Selenium和phantomjs来访问数据。

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

我尝试将getData函数放在第一次调用Alexa技能时运行的意图之后,但它只在初始化本地服务器时运行,并且只保存每个新Alexa会话的数据。因为数据经常变化,所以我希望每次我使用Alexa开始一个新的技能会话时,它都会执行该功能。

因此,我决定将实际获取数据的函数外包给另一个脚本,并使该脚本在循环中不断运行。这是我使用的代码。

代码语言:javascript
复制
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上的终端中运行。

有没有办法做我问的事情,或者有没有更简单的变通办法?任何和所有的帮助是感激的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-25 13:05:31

此问题已解决。

至于最初的问题,我不知道如何让它只导入字典,而不是首先运行函数来生成字典。此外,我意识到必须有一个更实际的解决方案,而不是不断运行这样的脚本,即使这样也得不到全新的数据。

我的解决方案是让让数据开始运行的脚本与启动函数同时运行。以下是第一个意图的最终脚本(其余部分保持不变):

代码语言:javascript
复制
@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

根据设计,这项技能需要一个数字密码,以确保在它愿意读取数据之前,我是使用它的那个人(这可能没有意义,但这项技能至少出于我自己的教育原因与实际原因一样多,所以,为了额外的练习,我希望它具有尽可能多的功能)。所以,当你真正能够请求数据的时候,获取数据的脚本已经运行完毕(我已经测试过了,看起来没有失败过)。

票数 0
EN

Stack Overflow用户

发布于 2017-12-25 08:47:43

听起来您想要导入函数,所以您可以运行它;而不是导入字典。

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

代码语言:javascript
复制
from getdata import getData

然后,每次您编写getData()时,它都会运行您的代码并获得一个新的最新字典。

这就是你要问的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47964574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档