저는 프로그래밍에 익숙하지 않고 매우 경험이 부족합니다. 다른 언어보다 더 간단하다고 생각하므로 파이썬을 배우고 있습니다. 어쨌든, 나는 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의 터미널에서 실행됩니다.
내가 묻는 것을 수행 할 방법이 있습니까? 더 쉬운 해결 방법이 있습니까? 모든 도움을 주시면 감사하겠습니다!
질문에 getData 함수를 포함 할 수 있습니까? 또한 알렉 사의 의도 호출에 대해 데이터를 여러 번 가져 오려고합니까? 그렇다면 통화 전에 데이터를 가져올 수없는 이유는 무엇입니까? 좀 더 잘 이해하려고 노력하면 도움이됩니다. – forumulator
질문에 함수를 추가했습니다. 나는 기본적으로 데이터의 여러 조각을 결합하고 Alexa 의도 호출 전에 사전을 형성하려고합니다. 이상적으로 나는 호출하기 전에 데이터를 얻고 싶습니다만, 자주 변경되기 때문에 스킬이 호출 된 후에 데이터를 가져와야한다고 생각합니다. 그리고 데이터를 가져올 때마다 Alexa가 시간을 초과합니다. – ProgrammerWhoCannotProgram
스크립트 전에 getData() 함수를 넣으려고했는데 스크립트를 초기화하기 위해 한 번 실행되었지만 알렉사와 새 세션을 시작할 때마다 데이터를 다시 확인하지 않습니다. 내가 원하는). 만약 내가 이것을 자신의 의도로 만들면, 그것은 단지 시간을 초과 할 것입니다. 알렉사에게 물어볼 때마다 10 초 이상 걸리고 최신 데이터를 가져 오는이 스크립트를 실행할 방법이 있습니까? – ProgrammerWhoCannotProgram