2017-12-24 17 views
0

저는 프로그래밍에 익숙하지 않고 매우 경험이 부족합니다. 다른 언어보다 더 간단하다고 생각하므로 파이썬을 배우고 있습니다. 어쨌든, 나는 Flask-Ask with ngrok를 사용하여 Alexa 스킬을 프로그래밍하여 데이터를 온라인으로 확인하려고 노력하고 있습니다 (시간당 두 번 변경됨). 스크립트는 4 개의 다른 번호 (다른 URL에서)를 취하여 사전으로 구성하고 Selenium과 phantomjs를 사용하여 데이터에 액세스합니다.함수 (파이썬)를 다시 실행하지 않고 한 스크립트의 함수에서 다른 스크립트로 값을 전송하는 방법은 무엇입니까?

Alexa가 너무 오래 걸리면 오류 메시지가 반환됩니다 (나는 ngrok로 시간이 초과되고 실제 오류가 발생하면 Python 로그가 표시됨을 알기 전에 8-10 초의 최대 런타임을 초과합니다. , 그리고 그것은 8-10 초 후에 반드시 스크립트의 중간에 있어야하지만 8-10 초 후에 발생합니다. 나는 단지 재발신 할 수 있다고 읽었지 만, 어떻게하면 8-10 초 더 걸릴지 모르며 스크립트는 보통 인터넷에서 데이터를 가져 오는 데 약 25 초가 걸린다. 사전으로 바꾸려면 두 번째).

Alexa 스킬이 처음 호출 될 때 실행되는 인 텐트 바로 뒤에 getData 함수를 넣으려고했지만 로컬 서버를 초기화하고 모든 새로운 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의 터미널에서 실행됩니다.

내가 묻는 것을 수행 할 방법이 있습니까? 더 쉬운 해결 방법이 있습니까? 모든 도움을 주시면 감사하겠습니다!

+0

질문에 getData 함수를 포함 할 수 있습니까? 또한 알렉 사의 의도 호출에 대해 데이터를 여러 번 가져 오려고합니까? 그렇다면 통화 전에 데이터를 가져올 수없는 이유는 무엇입니까? 좀 더 잘 이해하려고 노력하면 도움이됩니다. – forumulator

+0

질문에 함수를 추가했습니다. 나는 기본적으로 데이터의 여러 조각을 결합하고 Alexa 의도 호출 전에 사전을 형성하려고합니다. 이상적으로 나는 호출하기 전에 데이터를 얻고 싶습니다만, 자주 변경되기 때문에 스킬이 호출 된 후에 데이터를 가져와야한다고 생각합니다. 그리고 데이터를 가져올 때마다 Alexa가 시간을 초과합니다. – ProgrammerWhoCannotProgram

+0

스크립트 전에 getData() 함수를 넣으려고했는데 스크립트를 초기화하기 위해 한 번 실행되었지만 알렉사와 새 세션을 시작할 때마다 데이터를 다시 확인하지 않습니다. 내가 원하는). 만약 내가 이것을 자신의 의도로 만들면, 그것은 단지 시간을 초과 할 것입니다. 알렉사에게 물어볼 때마다 10 초 이상 걸리고 최신 데이터를 가져 오는이 스크립트를 실행할 방법이 있습니까? – ProgrammerWhoCannotProgram

답변

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 

, 기술을 만들기 위해 숫자 암호를 요청 내가 읽고 기꺼이 전에를 사용하여 하나 확인 데이터 (아마 무의미했지만,이 기술은 적어도 내 자신의 교육적인 이유로 실용적인 이유만큼이나 그렇기 때문에, 추가 연습을 위해, 아마도 내가 정당화 할 수있는만큼 많은 기능을 갖기를 원했습니다). 따라서 실제로 데이터를 요청할 수있게 될 때까지 데이터를 가져 오는 스크립트가 실행을 마칠 것입니다 (테스트를 거쳤으며 실패없이 작동하는 것 같습니다).

0

함수를 가져오고 싶은 것처럼 들리므로 실행할 수 있습니다. 사전을 가져 오는 것이 아니라

은 당신의 코드를 실행하고 새로운 최신의 사전을 얻을 것이다 그리고 다른 스크립트

from getdata import getData 

에 다음 getData() 쓸 때마다 run 기능을 삭제하려고합니다.

당신이 묻고있는 것입니까?

+0

음, 문제는 Alexa 스크립트가 시간 초과되지 않고 최신 최신 사전을 얻는 방법을 모르겠다는 것입니다. 알렉사가 응답을 기다리는 것을 포기하고 사전을 업데이트하기에는 충분하지 않은 오류를 반환하기 전에 알렉사가 의도를 실행 한 후 8 초가 남았습니다. 그래서, 어떻게 든 인 텐트 또는 무언가 사이에서 사전을 업데이트해야합니다. – ProgrammerWhoCannotProgram

+0

@ProgrammerWhoCannotProgram 같은 질문입니다. 어레아 인 텐트를 만들기 전에 매번 getData()를 호출 할 수없는 이유는 무엇입니까? – forumulator

+0

@forumulator 그게 내가하고 싶었던, 난 단지 방법을 알아낼 수 없었다. 인 텐트가 호출되면 함수를 실행하고 값을 반환하는 데 10 초가 소요됩니다 (함수를 종료 함). 두 개의 의도 정의 사이에 스크립트를 넣으려고했으나 스크립트를 초기화 할 때 실행되었고 실제로는 위의 의도보다 먼저 실행되지 않았습니다 (예상했던대로). 내 의도는 시작 의도와 동시에 실행하므로 시작 의도는 값을 반환 할 수 있지만 getData()는 계속 유지되며 사전이 필요할 때까지 완료됩니다. – ProgrammerWhoCannotProgram