Облачная функция Google выдает странную ошибку - PullRequest
0 голосов
/ 18 января 2019

Кто-нибудь здесь знаком с облачными функциями Google? Я прочитал их документацию и, основываясь на этом, настроил свой сценарий, чтобы попытаться работать в их размещенной среде.

https://cloud.google.com/functions/docs/concepts/python-runtime

Итак, мой скрипт на Python выглядит следующим образом.

def main():

    requests
    numpy
    pandas
    datetime
    requests
    pandas_gbq
    xml.etree.ElementTree


    # authentication: working....
    login = 'my_email' 
    password = 'my_password'


    AsOfDate = datetime.datetime.today().strftime('%m-%d-%Y')

    #step into URL
    REQUEST_URL = 'https://www.business.com/report-api/device=779142&rdate=Yesterday'
    response = requests.get(REQUEST_URL, auth=(login, password))
    xml_data = response.text.encode('utf-8', 'ignore') 

    #tree = etree.parse(xml_data)
    root = xml.etree.ElementTree.fromstring(xml_data)

    # start collecting root elements and headers for data frame 1
    desc = root.get("Description")
    frm = root.get("From")
    thru = root.get("Thru")
    loc = root.get("locations")
    loc = loc[:-1]
    df1 = pandas.DataFrame([['From:',frm],['Through:',thru],['Location:',loc]])
    df1.columns = ['S','Analytics']
    #print(df1)

    # start getting the analytics for data frame 2
    data=[['Goal:',root[0][0].text],['Actual:',root[0][1].text],['Compliant:',root[0][2].text],['Errors:',root[0][3].text],['Checks:',root[0][4].text]]
    df2 = pandas.DataFrame(data)
    df2.columns = ['S','Analytics']
    #print(df2)

    # merge data frame 1 with data frame 2
    df3 = df1.append(df2, ignore_index=True)
    #print(df3)

    # append description and today's date onto data frame
    df3['Description'] = desc
    df3['AsOfDate'] = AsOfDate


    # push from data frame, where data has been transformed, into Google BQ
    pandas_gbq.to_gbq(df3, 'Metrics', 'analytics', chunksize=None, reauth=False, if_exists='append', private_key=None, auth_local_webserver=False, table_schema=None, location=None, progress_bar=True, verbose=None)
    print('Execute Query, Done!!')

main()

if __name__ == '__main__':
    main()  

Кроме того, мой файл require.txt выглядит следующим образом.

requests
numpy
pandas
datetime
requests
pandas_gbq
xml.etree.ElementTree

Мой сценарий работал нормально в течение последних 2 месяцев, но мне нужно запускать его на своем ноутбуке каждый день. Чтобы уйти от этого ручного процесса, я пытаюсь запустить его в облаке. Проблема в том, что я получаю сообщение об ошибке: TypeError: main() takes 0 positional arguments but 1 was given

Мне кажется, что аргументы не приводятся и аргументы не ожидаются, но почему-то Google говорит, что дан 1 аргумент. Могу ли я немного изменить свой код, чтобы заставить его работать, или как-то обойти эту, казалось бы, безобидную ошибку? Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Следующий код берет ваш код и изменяет его для запуска в облачных функциях Google с использованием HTTP-триггера. Затем вы можете использовать Google Cloud Scheduler для вызова своей функции по расписанию. Вам также нужно будет создать requirements.txt с модулями, которые вам нужно импортировать. См. Этот документ для получения дополнительной информации.

def handler(request):

    import requests
    import numpy
    import pandas
    import datetime
    import requests
    import pandas_gbq
    import xml.etree.ElementTree


    # authentication: working....
    login = 'my_email' 
    password = 'my_password'


    AsOfDate = datetime.datetime.today().strftime('%m-%d-%Y')

    #step into URL
    REQUEST_URL = 'https://www.business.com/report-api/device=779142&rdate=Yesterday'
    response = requests.get(REQUEST_URL, auth=(login, password))
    xml_data = response.text.encode('utf-8', 'ignore') 

    #tree = etree.parse(xml_data)
    root = xml.etree.ElementTree.fromstring(xml_data)

    # start collecting root elements and headers for data frame 1
    desc = root.get("Description")
    frm = root.get("From")
    thru = root.get("Thru")
    loc = root.get("locations")
    loc = loc[:-1]
    df1 = pandas.DataFrame([['From:',frm],['Through:',thru],['Location:',loc]])
    df1.columns = ['S','Analytics']
    #print(df1)

    # start getting the analytics for data frame 2
    data=[['Goal:',root[0][0].text],['Actual:',root[0][1].text],['Compliant:',root[0][2].text],['Errors:',root[0][3].text],['Checks:',root[0][4].text]]
    df2 = pandas.DataFrame(data)
    df2.columns = ['S','Analytics']
    #print(df2)

    # merge data frame 1 with data frame 2
    df3 = df1.append(df2, ignore_index=True)
    #print(df3)

    # append description and today's date onto data frame
    df3['Description'] = desc
    df3['AsOfDate'] = AsOfDate


    # push from data frame, where data has been transformed, into Google BQ
    pandas_gbq.to_gbq(df3, 'Metrics', 'analytics', chunksize=None, reauth=False, if_exists='append', private_key=None, auth_local_webserver=False, table_schema=None, location=None, progress_bar=True, verbose=None)
    # print('Execute Query, Done!!')

    # Normally for an HTTP trigger you would return a full HTML page here
    # <html><head></head><body>you get the idea</body></html>
    return 'Execute Query, Done!!'
0 голосов
/ 18 января 2019

Вы неправильно понимаете, как работают облачные функции. Это не позволяет вам просто запускать произвольные сценарии. Вы пишете триггеры, которые отвечают на HTTP-запросы или когда что-то меняется в вашем облачном проекте. Кажется, это не то, что вы делаете здесь. Развертывания облачных функций не используют main ().

Возможно, вы захотите прочитать обзорную документацию , чтобы понять, для чего используются облачные функции.

Если вы пытаетесь что-то запускать периодически, подумайте о написании триггера HTTP и вызовите его каким-нибудь cron-подобным сервисом с желаемой скоростью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...