🐍 Python 2.0.0-preview: Cross-Platform Python in UiPath Studio Web

We’ve got something exciting for you to try :eyes:
The Python 2.0.0-preview activity package is now available — and it’s ready for real-world testing.

This preview introduces cross-platform Python support and opens the door to running Python directly from UiPath Studio Web.

If you love Python (or are Python-curious), this one’s for you.

:rocket: What’s new in Python 2.0.0-preview?

:white_check_mark: Cross-platform by design

With Python 2.0.0-preview, Python activities are now available across all platforms, including:

  • Windows
  • macOS
  • Linux

This means that you can now build automations and embed your Python code directly from Studio Web.
You can then debug them either on your local machine via the UiPath Assistant, or on the Cloud*

* Running on the Cloud runtime is not fully supported, but it is possible; read more below

What to expect in Studio Web

:desktop_computer: Running Python locally

:window: Windows

On Windows, things are straightforward and didn’t change:

  1. Install Python (3.12+ recommended).
  2. Make sure you have the .NET 8 Desktop Runtime installed on your local machine.
  3. In the Python Scope activity, configure it as follows:
    • Python path → the Python installation folder
      (e.g. C:\Users\<username>\AppData\Local\Programs\Python\Python3X\)
      It is the file path of the folder that contains the Python31x.exe file
    • Library path → the full path to python3x.dll
      (e.g. C:\Users\<username>\AppData\Local\Programs\Python\Python3X\python3.dll)
  4. You’re good to go — no extra steps needed. Select Debug on local machine in Studio Web and it will run locally via the UiPath Assistant.

:red_apple: macOS

Running your automations with Python on macOS works similarly, because you also need the Python path and the Library path.

To get the Python path, run this command:

which python3

It will return a full path of the python3 executable, for example:

/Library/Frameworks/Python.framework/Versions/3.13/bin/python3

For the Python Scope activity, this would be the Python path property input:

/Library/Frameworks/Python.framework/Versions/3.13/bin

However, for now there is a small limitation that we’ll fix soon. It can be worked around with a symlink so the python3 executable is discoverable as python

Small example how you could do it below:

ln -sf /Library/Frameworks/Python.framework/Versions/3.13/bin/python3 /opt/homebrew/bin/python

The last step is to find the Library path. It should be the full path to the dylib library file, for example:

/Library/Frameworks/Python.framework/Versions/3.13/lib/libpython3.13.dylib

Once configured, Python scripts run just fine on macOS from Studio Web, either as part of a published automation run from the UiPath Assistant or from Studio Web, via the Debug on local machine option.

:cloud: Running Python directly from the Cloud (Studio Web)

This section is not officially supported, but I wanted to show how to make it work for anyone who likes to experiment.

This is where things get really interesting/advanced.

With Studio Web + Python 2.0.0-preview, you can technically run Python without a local machine at all — directly in a cloud execution environment. You simply need the Python runtime.

However, cloud/serverless images are minimal, and do not currently bundle the Python runtime.

:white_check_mark: The solution: install a user-space Python at runtime

Below is the working approach for the preview:

  • No root access required
  • Works in serverless/cloud environments

:hammer_and_wrench: Workaround: install Python dynamically (no root required)

The easiest solution is to use uv, a lightweight, single-binary tool that downloads a standalone Python build (including libpython).

What this does

  • Downloads Python at runtime
  • Creates python / python3 executables
  • Provides the correct libpython*.so
  • Lets Python Scope initialize successfully

This all happens by using the Invoke Code activity with the following code snippet:

Dim RunBash As System.Func(Of String, String) =
    Function(cmd As String) As String
        Dim psi As New System.Diagnostics.ProcessStartInfo()
        psi.FileName = "/bin/bash"
        psi.Arguments = "-lc """ & cmd.Replace("""", "\""") & """"
        psi.RedirectStandardOutput = True
        psi.RedirectStandardError = True
        psi.UseShellExecute = False
        psi.CreateNoWindow = True

        Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
        Dim stdout As String = p.StandardOutput.ReadToEnd()
        Dim stderr As String = p.StandardError.ReadToEnd()
        p.WaitForExit()

        Dim combined As String = (If(stdout, "") & If(stderr, "")).Trim()
        If p.ExitCode <> 0 Then
            Throw New System.Exception("Command failed: " & cmd & vbCrLf & combined)
        End If
        Return combined
    End Function

Dim FirstLine As System.Func(Of String, String) =
    Function(s As String) As String
        If s Is Nothing Then Return ""
        Dim t As String = s.Replace(vbCr, "").Trim()
        Dim parts() As String = t.Split(New Char() {ChrW(10)}, System.StringSplitOptions.RemoveEmptyEntries)
        If parts.Length = 0 Then Return ""
        Return parts(0).Trim()
    End Function

Dim tmp As String = System.IO.Path.GetTempPath().TrimEnd("/"c)

Dim uvRoot As String = System.IO.Path.Combine(tmp, "uipath-uv")
Dim uvBin As String = System.IO.Path.Combine(uvRoot, "bin")
Dim pyBin As String = System.IO.Path.Combine(uvRoot, "pybin")
Dim pyInstallDir As String = System.IO.Path.Combine(uvRoot, "python")

If Not System.IO.Directory.Exists(uvBin) Then System.IO.Directory.CreateDirectory(uvBin)
If Not System.IO.Directory.Exists(pyBin) Then System.IO.Directory.CreateDirectory(pyBin)
If Not System.IO.Directory.Exists(pyInstallDir) Then System.IO.Directory.CreateDirectory(pyInstallDir)

Dim uvExe As String = System.IO.Path.Combine(uvBin, "uv")

' 1) Install uv (standalone installer)
If Not System.IO.File.Exists(uvExe) Then
    RunBash("curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR='" & uvBin & "' sh")
End If

' Sanity check
RunBash("'" & uvExe & "' --version")

' 2) Install managed Python 3.13 and put executables in pyBin
' --default installs python and python3 shims (plus versioned python3.10) in the bin dir. :contentReference[oaicite:1]{index=1}
' We also set UV_PYTHON_INSTALL_DIR so the actual Python files live under pyInstallDir. :contentReference[oaicite:2]{index=2}
RunBash(
    "env UV_PYTHON_INSTALL_DIR='" & pyInstallDir & "' " &
    "UV_PYTHON_BIN_DIR='" & pyBin & "' " &
    "'" & uvExe & "' python install 3.13 --default --force"
)

' 3) Determine which python executable to use (prefer unversioned python)
Dim pythonExe As String = (System.IO.Path.Combine(pyBin, "python"))
If Not System.IO.File.Exists(pythonExe) Then
    pythonExe = (System.IO.Path.Combine(pyBin, "python3"))
End If
If Not System.IO.File.Exists(pythonExe) Then
    pythonExe = FirstLine(RunBash("ls -1 '" & pyBin & "'/python3.* 2>/dev/null | head -n 1 || true"))
End If
If pythonExe = "" OrElse Not System.IO.File.Exists(pythonExe) Then
    Throw New System.Exception("uv installed Python, but no python executable found in: " & pyBin)
End If

' 4) Find libpython*.so* under the managed install directory
Dim libpython As String =
    FirstLine(RunBash("find '" & pyInstallDir & "' -type f -name 'libpython3.10.so*' -print -quit 2>/dev/null || true"))

If libpython = "" Then
    libpython = FirstLine(RunBash("find '" & pyInstallDir & "' -type f -name 'libpython*.so*' -print -quit 2>/dev/null || true"))
End If

If libpython = "" Then
    Throw New System.Exception("Could not find libpython*.so* under: " & pyInstallDir)
End If

' 5) Final outputs for UiPath Python Scope
pythonPathForScope = pyBin
libraryPathForScope = libpython

Dim ver As String = FirstLine(RunBash("'" & pythonExe & "' --version 2>&1 || true"))

report =
    "Python Scope config:" & vbCrLf &
    "PythonPath  = " & pythonPathForScope & vbCrLf &
    "LibraryPath = " & libraryPathForScope & vbCrLf &
    "PythonExe   = " & pythonExe & vbCrLf &
    "Version     = " & ver

' Use these in UiPath:
' - pythonPathForScope  -> Python Scope: Python path
' - libraryPathForScope -> Python Scope: Library path (full file path on Linux)
' - report              -> Log/debug

The script already returns the correct paths that can be used directly in the Python Scope activity like this:

Field Value
Python path pythonPathForScope
Library path libraryPathForScope

That’s it :tada:
You can now run Python scripts directly from Studio Web, fully in the cloud.

See it yourself via this sample solution you can easily import in Studio Web:
Run Python script on cloud sample.uis (7.8 KB)

It should run the included Python script out of the box and on the UiPath Cloud environment.

Let us know what you think

We count on your feedback to drive our future improvements!

7 Likes

Good addition. One reason I have been apprehensive about using Studio Web is you can’t just use C# when you want to like in Studio for desktop. This might slightly tip the scale.