在苹果硅上使用Python运行Azure功能
#python #azure #azurefunctions #applesilicon

如果您是Apple用户,并且想使用Python构建Azure功能,那么您就不幸了。 Azure功能核心工具不支持python在ARM64上的功能。有一个解决方法,这篇文章向您展示了如何。

ARM64支持Azure功能

Apple于2020年11月使用其Apple Silicon处理器(目前M1和M2)移至ARM64架构,现在他们的整个Linup都使用了Apple Silicon,除了相当过时的Mac Pro。尽管如此,在ARM64上运行Python功能的支持尚未实现。您可以使用func initfunc new创建功能,但是当您运行它们时,您会收到一个错误:

➜ functions-m1 func start
Found Python version 3.10.11 (python3).

Azure Functions Core Tools
Core Tools Version: 4.0.5095 Commit hash: N/A (64-bit)
Function Runtime Version: 4.16.5.20396

[2023-05-08T21:29:33.030Z] Failed to initialize worker provider for: /opt/homebrew/Cellar/azure-functions-core-tools@4/4.0.5095/workers/python
[2023-05-08T21:29:33.030Z] Microsoft.Azure.WebJobs.Script: Architecture Arm64 is not supported for language python.
[2023-05-08T21:29:33.409Z] Failed to initialize worker provider for: /opt/homebrew/Cellar/azure-functions-core-tools@4/4.0.5095/workers/python
[2023-05-08T21:29:33.409Z] Microsoft.Azure.WebJobs.Script: Architecture Arm64 is not supported for language python.
[2023-05-08T21:29:33.558Z] A host error has occurred during startup operation '2a13f8c8-f2e4-4da0-a88c-205dbd3065c2'.
[2023-05-08T21:29:33.558Z] Microsoft.Azure.WebJobs.Script: Did not find functions with language [python].
[2023-05-08T21:29:33.564Z] Failed to stop host instance '1e7799d1-a87f-404a-9bc1-858c7724aeec'.
[2023-05-08T21:29:33.564Z] Microsoft.Azure.WebJobs.Host: The host has not yet started.
Value cannot be null. (Parameter 'provider')

Microsoft最初针对其Python 3.10版本的支持,但错过了。目前,他们说,如this GitHub issue所述,它将带有Python 3.11的支持。他们建议的解决方法涉及将您的终端更改为始终在Rosetta 2下运行,这感觉就像是做事的坏方式。有一个更好的解决方法,利用开发容器。

开发容器

开发容器是您运行并从VS代码连接的Docker容器。作为用户,这些是无缝的 - 您仍然可以从VS代码外部访问文件系统,但是在内部,Dev环境在容器中运行,所有依赖项都安装在容器中,而不是在主机OS上。您可以在the VS Code developing inside containers documentation上阅读有关这些信息。

Docker支持使用QEMU仿真或使用Rosetta 2在Apple Silicon Mac上运行X86和X64容器。这意味着您可以创建一个X64容器并在Mac上运行此操作,并在容器内运行Azure函数核心工具!很酷,嘿!

配置Docker

您需要安装docker,因此请先安装此此操作。安装后,您需要配置一些东西。

  • 从docker菜单项中,选择设置

  • 一般节中,确保选择虚拟化框架

The Use Virtualization framework in the general tab of the settings dialog

  • 从开发中的特征部分中,选择 beat特征,然后选择在Apple Silicon上使用X86/AMD64的Rosetta

The Use Rosetta for x86/amd64 emulation on Apple Silicon setting from the Features in development section

  • 应用这些更改,Docker桌面将重新启动。

创建开发容器

默认的Azure函数和Python3 Dev容器是理想的选择,因为它是x86/x64容器。

  • 确保Docker正在运行。

  • 为您的Azure Functions应用创建一个文件夹,然后在VS代码中打开它(或打开您已经创建的一个文件夹)

  • 确保您安装了Dev Containers extension。这也带有Remote Development extension Pack

  • 打开命令调色板并选择 dev容器:添加dev容器配置文件

The Dev Containers: Add Dev Container configuration files command palette option

  • 选择显示所有定义以查看所有开发容器选项

The show all definitions option

  • 搜索并选择 azure函数&Python 3

The definitions filtered by Azure Functions with the cursor over Azure Functions & Python 3

  • 选择您想要的任何其他功能。您不需要任何Azure功能才能工作。

  • 将构建容器文件,并将弹出一个选项以重新打开容器中的文件夹。选择在容器中重新打开

The reopen in container popup

  • 一旦存储库重新打开在容器中,打开终端,您会看到它标记为Rosetta下的运行

The terminal with an indicator on the toolbar showing it is running under Rosetta

  • 如果您已经没有Azure函数应用程序,现在可以创建一个。

  • 运行您的Azure函数应用程序!

将DevContainer文件提交给GitHub后,您还可以在CodeSpace中打开此文件,并将其与所需的所有内容进行预配合。您还可以根据您的需求将更多内容添加到容器中,例如,加载容器时自动加载的扩展名,安装物品,无论您需要什么!查看the VS Code developing inside containers documentation以了解更多信息。