在 Azure 自动化中管理 Python 3 程序包

本文介绍如何在 Azure 自动化(在 Azure 沙盒环境和混合 Runbook 辅助角色上运行)中导入、管理和使用 Python 3 包。 要成功执行作业,应在混合 Runbook 辅助角色上下载 Python 包。 为了帮助简化 runbook,可以使用 Python 包导入所需的模块。

有关如何管理 Python 2 包的信息,请参阅管理 Python 2 包

默认 Python 包

为了在自动化服务中支持 Python 3.8 runbook,默认安装了一些 Python 包,此处提供了这些包的列表。 通过在自动化帐户中导入 Python 包,可以替代默认版本。

优先考虑自动化帐户中已导入的版本。 若要导入单个包,请参阅导入包。 若要导入包含多个包的包,请参阅导入具有依赖项的包

作为源文件的包

Azure 自动化仅支持 Python 包,该 Python 只包含 Python 代码,不包括其他语言的扩展或者用其他语言写成的代码。 然而,Azure 沙盒可能没有所需的 C/C++ 二进制文件编辑器,所以建议使用 wheel 文件

Python 包索引 (PyPI) 是 Python 编程语言的软件存储库。 从 PyPI 中选择 Python 3 包导入自动化帐户时,请注意以下文件名部分:

选择 Python 版本:

Python 3.8(正式版)

文件名部分 说明
cp38 自动化支持使用 Python 3.8 进行云作业。
amd64 Azure 沙盒进程是 Windows 64 位体系结构。

例如:

  • 若要导入 pandas - 选择名称类似于 pandas-1.2.3-cp38-win_amd64.whl 的 wheel 文件。

PyPI 上面的一些 Python 包不提供 wheel 文件。 在这种情况下,下载源文件(.zip 或者.tar.gz 文件)然后使用 pip 生成 wheel 文件。

使用装有 Python 3.8.x 和 wheel 包的 64 位 Windows 计算机执行以下步骤:

  1. 下载源文件pandas-1.2.4.tar.gz
  2. 运行 pip,使用以下命令获取 wheel 文件:pip wheel --no-deps pandas-1.2.4.tar.gz

导入包

  1. 在你的自动化帐户中,在“共享资源”下选择“Python 程序包”。 接下来,选择 + 添加 Python 包

    Screenshot of the Python packages page shows Python packages in the left menu and Add a Python package highlighted.

  2. 添加 Python 包页中,选择要上传的本地包。 对于 Python 3.8,该包可以是 .whl 或 .tar.gz 文件。

  3. 输入名称,并选择 Python 3.8 作为“运行时版本”。

  4. 选择“导入” 。

    Screenshot shows the Add Python 3.8 Package page with an uploaded tar.gz file selected.

导入包后,它会在自动化帐户中的“Python 包”页上列出。 若要删除某个包,请先选择该包,然后选择删除

Screenshot shows the Python 3.8 packages page after a package has been imported.

导入具有依赖项的包

可以导入 Python 3.8 包及其依赖项,方法是将以下 Python 脚本导入到 Python 3.8 runbook 中。 确保为自动化帐户启用了托管标识,并使托管标识具有“自动化参与者”访问权限,以便成功导入包。

https://github.com/azureautomation/runbooks/blob/master/Utility/Python/import_py3package_from_pypi.py

将脚本导入 runbook

有关导入 runbook 的信息,请参阅从 Azure 门户导入 runbook。 在运行导入之前,请将文件从 GitHub 复制到可供门户访问的存储中。

“导入 runbook”页默认将 runbook 名称设置为与脚本名称匹配。 如果有权访问该字段,则可以更改该名称。 Runbook 类型可能默认设置为 Python 2.7。 如果是这样,请确保将其更改为 Python 3.8

Screenshot shows the Python 3 runbook import page.

执行 runbook 以导入包和依赖项

创建并发布 runbook 后,运行它来导入包。 若要详细了解如何执行 runbook,请参阅在 Azure 自动化中启动 runbook

脚本 (import_py3package_from_pypi.py) 需要以下参数。

参数 说明
subscription_id 自动化帐户的订阅 ID
resource_group 在其中定义自动化帐户的资源组的名称
automation_account 自动化帐户名称
module_name 要从 pypi.org 导入的模块的名称
module_version 模块的版本

应按以下格式将参数值作为单个字符串提供:

-s <subscription_id> -g <resource_group> -a<automation_account> -m <module_name> -v <module_version>

若要详细了解如何在 runbook 中使用参数,请参阅使用 runbook 参数

在 runbook 中使用包

导入程序包后,可以在 runbook 中使用它。 添加以下代码以列出 Azure 订阅中的所有资源组。

#!/usr/bin/env python3 
import os 
import requests  
# printing environment variables 
endPoint = os.getenv('IDENTITY_ENDPOINT')+"?resource=https://management.chinacloudapi.cn/" 
identityHeader = os.getenv('IDENTITY_HEADER') 
payload={} 
headers = { 
  'X-IDENTITY-HEADER': identityHeader,
  'Metadata': 'True' 
} 
response = requests.request("GET", endPoint, headers=headers, data=payload) 
print(response.text)

注意

Python automationassets 包在 pypi.org 上不可用,因此无法将其导入到 Windows 混合 Runbook 辅助角色。

确定沙盒中可用的包

使用以下代码列出默认已安装的模块:

#!/usr/bin/env python3

import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
   for i in installed_packages])

for package in installed_packages_list:
    print(package)

Python 3.8 PowerShell cmdlet

添加新的 Python 3.8 包

New-AzAutomationPython3Package -AutomationAccountName tarademo  -ResourceGroupName mahja -Name requires.io -ContentLinkUri https://files.pythonhosted.org/packages/7f/e2/85dfb9f7364cbd7a9213caea0e91fc948da3c912a2b222a3e43bc9cc6432/requires.io-0.2.6-py2.py3-none-any.whl 

Response  
ResourceGroupName     : mahja 
AutomationAccountName : tarademo 
Name                  : requires.io 
IsGlobal              : False 
Version               : 
SizeInBytes           : 0 
ActivityCount         : 0 
CreationTime          : 9/26/2022 1:37:13 PM +05:30 
LastModifiedTime      : 9/26/2022 1:37:13 PM +05:30 
ProvisioningState     : Creating 

列出所有 Python 3.8 包

Get-AzAutomationPython3Package -AutomationAccountName tarademo  -ResourceGroupName mahja 

Response : 
ResourceGroupName     : mahja 
AutomationAccountName : tarademo 
Name                  : cryptography 
IsGlobal              : False 
Version               : 
SizeInBytes           : 0 
ActivityCount         : 0 
CreationTime          : 9/26/2022 11:52:28 AM +05:30 
LastModifiedTime      : 9/26/2022 12:11:00 PM +05:30 
ProvisioningState     : Failed 
ResourceGroupName     : mahja 
AutomationAccountName : tarademo 
Name                  : requires.io 
IsGlobal              : False 
Version               : 
SizeInBytes           : 0 
ActivityCount         : 0 
CreationTime          : 9/26/2022 1:37:13 PM +05:30 
LastModifiedTime      : 9/26/2022 1:39:04 PM +05:30 
ProvisioningState     : ContentValidated 
ResourceGroupName     : mahja 
AutomationAccountName : tarademo 
Name                  : sockets 
IsGlobal              : False 
Version               : 1.0.0 
SizeInBytes           : 4495 
ActivityCount         : 0 
CreationTime          : 9/20/2022 12:46:28 PM +05:30 
LastModifiedTime      : 9/22/2022 5:03:42 PM +05:30 
ProvisioningState     : Succeeded 

获取有关特定包的详细信息

Get-AzAutomationPython3Package -AutomationAccountName tarademo  -ResourceGroupName mahja -Name sockets 


Response  
ResourceGroupName     : mahja 
AutomationAccountName : tarademo 
Name                  : sockets 
IsGlobal              : False 
Version               : 1.0.0 
SizeInBytes           : 4495 
ActivityCount         : 0 
CreationTime          : 9/20/2022 12:46:28 PM +05:30 
LastModifiedTime      : 9/22/2022 5:03:42 PM +05:30 
ProvisioningState     : Succeeded 

删除 Python 3.8 包

Remove-AzAutomationPython3Package -AutomationAccountName tarademo  -ResourceGroupName mahja -Name sockets 

更新 Python 3.8 包

Set-AzAutomationPython3Package -AutomationAccountName tarademo  -ResourceGroupName mahja -Name requires.io -ContentLinkUri https://files.pythonhosted.org/packages/7f/e2/85dfb9f7364cbd7a9213caea0e91fc948da3c912a2b222a3e43bc9cc6432/requires.io-0.2.6-py2.py3-none-any.whl 


ResourceGroupName     : mahja 
AutomationAccountName : tarademo 
Name                  : requires.io 
IsGlobal              : False 
Version               : 0.2.6 
SizeInBytes           : 10109 
ActivityCount         : 0 
CreationTime          : 9/26/2022 1:37:13 PM +05:30 
LastModifiedTime      : 9/26/2022 1:43:12 PM +05:30 
ProvisioningState     : Creating 

后续步骤

要准备 Python runbook,请参阅创建 Python runbook