当前位置: 首页 > 知识库问答 >
问题:

从本地Python函数到谷歌云函数

戚英逸
2023-03-14

我为API调用创建了一个Python函数,因此我不再需要在Power BI中这样做。它创建了5个XML文件,然后将它们合并成一个CSV文件。我希望该功能在谷歌云上运行(如果这不是一个好主意,请纠正我)。

我认为不可能在函数中创建XML文件(也许可以写入bucket),但理想情况下,我希望跳过XML文件的创建,直接创建CSV。

请在下面找到生成XML文件并合并为CSV的代码:

offices = ['NL001', 'NL002', 'NL003', 'NL004', 'NL005']
#Voor elke office inloggen, office veranderen en een aparte xml maken
for office in offices:

    xmlfilename = office+'.xml'

    session.service.SelectCompany(office, _soapheaders={'Header': auth_header})
    proces_url = cluster + r'/webservices/processxml.asmx?wsdl'
    proces = Client(proces_url)
    response = proces.service.ProcessXmlString(query.XML_String,  _soapheaders={'Header': auth_header})

    f = open(xmlfilename, 'w')
    f.write(response)
    f.close()

到csv

if os.path.exists('CombinedFinance.csv'):
  os.remove('CombinedFinance.csv')
else:
  print("The file does not exist")

xmlfiles = ['NL001.xml','NL002.xml','NL003.xml','NL004.xml','NL005.xml']
for xmlfile in xmlfiles:
    with open(xmlfile, encoding='windows-1252') as xml_toparse:
        tree = ET.parse(xml_toparse)

    root = tree.getroot()
    columns = [element.attrib['label'] for element in root[0]]
    columns.append('?')

    data = [[field.text for field in row] for row in root[1::]]
    df = pd.DataFrame(data, columns=columns)
    df = df.drop('?', axis=1)

    df.to_csv('CombinedFinance.csv', mode='a', header=not os.path.exists('CombinedFinance.csv'))

有什么想法吗?

n. b.如果我能改进我的代码,请让我知道,我只是在学习这一切

编辑:为了回应一些评论,代码现在看起来是这样的。部署到云端时,我遇到以下错误:

错误:(gcloud.functions.deploy)操作错误:代码=13,消息=由于运行状况检查失败,函数部署失败。这通常表示代码生成成功,但在测试执行期间失败。检查日志以确定原因。如果看起来是暂时的,请在几分钟后再次尝试部署。

我的要求。txt如下所示:

大熊猫

有什么想法吗?

import pandas as pd
import xml.etree.ElementTree as ET
from zeep import Client
import query
import authentication
import os

sessionlogin = r'https://login.twinfield.com/webservices/session.asmx?wsdl'
login = Client(sessionlogin)

auth = login.service.Logon(authentication.username, authentication.password, authentication.organisation)

auth_header = auth['header']['Header']
cluster = auth['body']['cluster']

#Use cluster to create a session:

url_session = cluster + r'/webservices/session.asmx?wsdl'
session = Client(url_session)

#Select a company for the session:

offices = ['NL001', 'NL002', 'NL003', 'NL004', 'NL005']
#Voor elke office inloggen, office veranderen en een aparte xml maken
for office in offices:

    session.service.SelectCompany(office, _soapheaders={'Header': auth_header})
    proces_url = cluster + r'/webservices/processxml.asmx?wsdl'
    proces = Client(proces_url)
    response = proces.service.ProcessXmlString(query.XML_String,  _soapheaders={'Header': auth_header})


    treetje = ET.ElementTree(ET.fromstring(response))
    root = treetje.getroot()
    columns = [element.attrib['label'] for element in root[0]]
    columns.append('?')

    data = [[field.text for field in row] for row in root[1::]]
    df = pd.DataFrame(data, columns=columns)
    df = df.drop('?', axis=1)

    df.to_csv('/tmp/CombinedFinance.csv', mode='a', header=not os.path.exists('/tmp/CombinedFinance.csv'))

共有1个答案

董永宁
2023-03-14

关于将常规Python脚本(您在这里所拥有的)转换为云函数,需要考虑的一些事情:

  • 云函数响应事件——HTTP请求或其他后台触发器。你应该想想“什么会触发我的功能?”
  • HTTP函数接收与传入请求相对应的请求,并且必须返回某种HTTP响应
  • 文件系统中唯一可用的可写入部分是/tmp。在执行函数的过程中,您必须将所有文件都写入其中
  • 文件系统是短暂的。你不能期望文件在调用之间停留。您创建的任何文件都必须存储在其他位置(如GCS存储桶中),或者在HTTP响应中返回(如果是HTTP函数)
  • 云功能有一个非常特定的签名,您需要将现有业务逻辑封装在其中:
def my_http_function(request):
    # business logic here
    ...
    return "This is the response", 200
def my_background_function(event, context):
    # business logic here
    ...
    # No return necessary
 类似资料:
  • 问题内容: 我需要执行一些python机器学习代码,并希望从Google Cloud Function中的节点进程执行它。 我想使用node,因为我有一些稍后要运行的firebase管理任务。我也有一个我满意的节点的部署工作流。 这可能吗?如果是这样,您能举个例子吗? 问题答案: 是的,这是可能的,您可能需要使用http://www.pyinstaller.org/来打包python代码。看看我的

  • 我不知道该怎么说,但我觉得谷歌在我不知情的情况下改变了一些东西。我过去常常从日志仪表板中Google Cloud Console中的python Cloud Functions获取日志。现在,它刚刚停止工作。 所以我去调查了很长时间,我只是做了一个日志 hello world python Cloud Function: 因此,这是我 main.py,我将其部署为具有http触发器的云函数。 因为

  • 这个python脚本的目的是从google analytics中提取数据,并将其添加到google MySQL数据库中。该脚本在我的本地机器上工作,但在google函数上不行: 当我运行上面的代码时,我得到了这些错误: 错误消息 我想这可能是因为谷歌机器的IP地址没有被列入我的SQL数据库的白名单。我尝试添加一个带有外部IP地址的云NAT,以便将其列入白名单。那没用。下面是一篇文章的链接,该文章有

  • 我正在尝试使用谷歌云数据流将谷歌PubSub消息写入谷歌云存储。PubSub消息采用json格式,我要执行的唯一操作是从json到parquet文件的转换。

  • 我尝试运行一个数据流管道,使用DirectPipelineRunner从本地计算机(windows)读取数据,并写入Google云存储。作业失败,出现以下指定FileNotFoundException的错误(因此我认为数据流作业无法读取我的位置)。我正在本地计算机上运行作业,以运行我创建的基于GCP的模板。我可以在GCP数据流仪表板中看到它,但由于以下错误而失败。请帮忙。我还尝试了本地机器的IP或

  • 按照https://cloud.google.com/endpoints/docs/openapi/get-started-cloud-functions入门指南获取CDN背后的云功能。将ESPv2 Beta部署到Cloud Run并获得预配的CloudRun服务URL。现在我的文件碰壁了。当我运行命令时: 我得到了错误响应: 我正在使用的似乎与教程中的示例几乎相同,并且似乎此错误表示云函数终结点