Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
5 years ago
Solved

¿Puedo ejecutar scripts de Python externos en el escritorio de Power BI?

Realmente disfruto integrando scripts de Python en mis consultas, pero estoy empezando a encontrarme con un problema. Quiero usar parámetros de entrada para mis scripts de Python, y parece que la única forma de hacerlo también rompe el editor de Python incorporado y hace que la lectura del código M sea muy fea.

    Source = Python.Execute("from urllib.parse import unquote#(lf)import re#(lf)import io#(lf)#(lf)input_url = """&SafeLinkURL&"""#(lf)table = """"""url;#(lf)""""""+input_url+""""""#(lf)""""""#(lf)df = pandas.read_csv(io.StringIO(table))#(lf)print(df)#(lf)"),

Me parece que una buena solución sería externalizar mejor el script python...
¿Hay alguna manera de ejecutar scripts locales externos de Python a través de la función Python.Execute que se pueda mantener fácilmente?

  • Esta es una buena sugerencia: es posible que desee plantearla como una idea.

    El problema (como yo lo veo) es la implementación interpretativa elegida por los desarrolladores de Power BI (Power Query) (básicamente Expression.Evaluate() ). Puede abusar del parámetro adicional en la llamada de Python para entregar la fuente del conjunto de datos, pero sigue siendo torpe. El mismo enfoque está presente en el lado visual de Power BI, por cierto, aún más restrictivo.

  • Syndicate_Admin's avatar
    Syndicate_Admin
    4 years ago

    Entonces, aunque esto no respondió directamente a mi pregunta, me diste algunos términos de búsqueda que me llevaron a esta página:

    https://blog.crossjoin.co.uk/2014/02/04/loading-power-query-m-code-from-text-files/

    Donde pude hacer una técnica similar para importar un archivo python local como un var de cadena:

    let
        PythonFile = Text.FromBinary(File.Contents("C:\test.py")),
        Source = Python.Execute(PythonFile)
    in
        Source

    Ahora, ¿cómo puedo poner una variable de entrada en el script de Python sin romper la importación de cadenas? Es posible que tenga que dividir el código python en dos archivos y compilar la cadena python importada en el código M antes de ejecutarlo como un bloque completo.

4 Replies

  • Esta es una buena sugerencia: es posible que desee plantearla como una idea.

    El problema (como yo lo veo) es la implementación interpretativa elegida por los desarrolladores de Power BI (Power Query) (básicamente Expression.Evaluate() ). Puede abusar del parámetro adicional en la llamada de Python para entregar la fuente del conjunto de datos, pero sigue siendo torpe. El mismo enfoque está presente en el lado visual de Power BI, por cierto, aún más restrictivo.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Entonces, aunque esto no respondió directamente a mi pregunta, me diste algunos términos de búsqueda que me llevaron a esta página:

      https://blog.crossjoin.co.uk/2014/02/04/loading-power-query-m-code-from-text-files/

      Donde pude hacer una técnica similar para importar un archivo python local como un var de cadena:

      let
          PythonFile = Text.FromBinary(File.Contents("C:\test.py")),
          Source = Python.Execute(PythonFile)
      in
          Source

      Ahora, ¿cómo puedo poner una variable de entrada en el script de Python sin romper la importación de cadenas? Es posible que tenga que dividir el código python en dos archivos y compilar la cadena python importada en el código M antes de ejecutarlo como un bloque completo.

      • Syndicate_Admin's avatar
        Syndicate_Admin
        Icon for Administrator rankAdministrator

        Sí, básicamente es volver al punto de partida. Lo que podría hacer es crear su propia convención de lenguaje que de alguna manera identifique sus variables en su código python, y luego haga un poco de manipulación de texto para dividir su cadena python en los lugares correctos y cortes en los nombres de las variables como lo espera Power Query ...