首页 > 编程问答 >Docker:无法在 docker 映像中使用 pythonnet 和 |无法创建默认的 .NET 运行时,该运行时在此系统上是“单声道”的

Docker:无法在 docker 映像中使用 pythonnet 和 |无法创建默认的 .NET 运行时,该运行时在此系统上是“单声道”的

时间:2024-07-23 14:00:37浏览次数:14  
标签:python .net docker mono python.net

我正在尝试使用 clr from Pythonnet 使用 .DLL 引用将一种文件类型转换为另一种文件类型。

这就是我的代码的样子 -

import clr

clr.AddReference(dll_path)
import RxLibrary

# Convert to ASC Format -----------
input_file = f"./{filename}.rxd"
output_file = f"./{filename}.asc"
RxLibrary.RxLib.ConvertData(input_file, output_file)

这是我的 dockerfile -

# Use an official Python runtime as a parent image
FROM python:3.9-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org boto3 python-dateutil asammdf pytz pythonnet

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run test3.py when the container launches
CMD ["python", "./test3.py"]

这是我得到的错误 -

RuntimeError: Failed to create a default .NET runtime, which would
                    have been "mono" on this system. Either install a
                    compatible runtime or configure it explicitly via
                    `set_runtime` or the `PYTHONNET_*` environment variables
                    (see set_runtime_from_env).

我尝试使用来自 SO 答案之一的这个 --

from pythonnet import load
load('coreclr')
import clr

但我得到的错误是 -

RuntimeError: Failed to create a .NET runtime (coreclr) using the
                parameters {}.

我已经尝试了来自 SO 和整个互联网的多个答案。我仍然没能解决这个问题。


错误信息“无法创建默认的 .NET 运行时,该运行时在此系统上是“mono””表明 pythonnet 在的 Docker 容器中找不到兼容的 .NET 运行时。尽管提到了尝试使用 coreclr ,但的 Dockerfile 并未安装它。

以下是如何使用 coreclr 在的 Docker 容器中正确设置 pythonnet 的步骤:

1. 安装 .NET Core SDK

需要安装 .NET Core SDK 来使用 coreclr 。将以下行添加到的 Dockerfile 中:

# 从 https://dotnet.microsoft.com/en-us/download/dotnet 安装 .NET Core SDK
RUN wget https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-6.0.302-linux-x64-binaries -O dotnet.tar.gz \
    && mkdir -p /usr/share/dotnet \
    && tar zxf dotnet.tar.gz -C /usr/share/dotnet \
    && rm dotnet.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

此代码段将下载 .NET Core SDK 6.0 并将其安装到 /usr/share/dotnet 。同时,它还创建了一个指向 /usr/bin/dotnet 的符号链接,以便可以从任何地方运行它。

2. 指定 .NET 运行时

安装 .NET Core SDK 后,需要告诉 pythonnet 在哪里找到它。可以使用 PYTHONNET_RUNTIME 环境变量来实现。将以下行添加到的 Dockerfile 中:

ENV PYTHONNET_RUNTIME=coreclr

此行将 coreclr 设置为 pythonnet 使用的运行时。

3. 调整的 requirements.txt 文件

确保的 requirements.txt 文件包含 pythonnet

pythonnet>=2.5.2

完整 Dockerfile

这是更新后的 Dockerfile,其中包含所有必要的更改:

# 使用官方 Python 运行时作为父镜像
FROM python:3.9-slim

# 设置工作目录为 /app
WORKDIR /app

# 将当前目录内容复制到容器的 /app 中
COPY . /app

# 安装 .NET Core SDK
RUN wget https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-6.0.302-linux-x64-binaries -O dotnet.tar.gz \
    && mkdir -p /usr/share/dotnet \
    && tar zxf dotnet.tar.gz -C /usr/share/dotnet \
    && rm dotnet.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

# 设置 .NET 运行时
ENV PYTHONNET_RUNTIME=coreclr

# 安装任何 requirements.txt 中指定的所需软件包
RUN pip install --trusted-host pypi.python.org boto3 python-dateutil asammdf pytz pythonnet

# 将端口 80 暴露给容器外部的世界
EXPOSE 80

# 定义环境变量
ENV NAME World

# 容器启动时运行 test3.py
CMD ["python", "./test3.py"]

其他提示

  • 确保的 .DLL 文件位于的 Docker 映像中,并且路径正确。
  • 可以通过修改上面的 Dockerfile 中的版本号来安装不同版本的 .NET Core SDK。
  • 如果在 Windows 容器中运行此程序,则需要相应地调整安装 .NET Core SDK 的步骤。

完成这些更改后,构建并运行的 Docker 映像。pythonnet 现在应该可以使用 coreclr 运行时访问的 .NET 代码。

标签:python,.net,docker,mono,python.net
From: 77186515

相关文章

  • 在 Python 中以非常高的质量保存图像
    如何以非常高的质量保存Python绘图?也就是说,当我不断放大PDF文件中保存的对象时,为什么没有任何模糊?另外,什么是最好的模式将其保存在?png,eps?或者其他的?我不能pdf,因为有一个隐藏的数字会扰乱Latexmk编译。要以非常高的质量保存Py......
  • Python字符串:提取重复和随机合并的子字符串
    重复和合并字符串的示例:16.01068.0%08p%.a.p.a.要提取的所需子字符串:16.008%p.a.完整示例:CCoonnttiinnggeennttCCoouuppoonn16.01068.0%08p%.a.p(.Ma.o(nMtholyn)thly)所需子字符串:ContingentCoupon16.008%p.a.(Monthly)我的问题是当原始......
  • Python Pandas 从使用第 3 部分 API 自动生成的 Excel 文件中读取不一致的日期格式
    我正在使用PDF4meAPI将PDF发票转换为Excel文件。API可以正确读取日期。但是,当我打开Excel文件时,日期显示不一致:某些日期以正确的格式(dd/mm/yyyy)显示,而其他日期以错误的mm/dd/yyyy格式显示。当该月的某天小于或等于12时,似乎会出现这种不一致。......
  • python-input键盘输入
     str=input("请输入:")#用户键盘输入#str表示一个字符串类型的变量,input会将读取到的字符串放入str中print(str) aa='请输入:'str=input(aa)#用户键盘输入#str表示一个字符串类型的变量,input会将读取到的字符串放入str中print(str)      ......
  • Python从0到100(四十五):从字符串到前后端分离
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • Python的运算符与条件表达式
    一、运算符Python数据是通过使用运算符来进行操作的,与数学运算符类似,主要运用于数字计算,比较大小和逻辑运算。Python中的运算符主要包括算术运算符、赋值运算符、比较运算符、逻辑运算符和位运算符。1.算术运算符算术运算符用在数字表达式中,作用和在数学中是一样的。Python......
  • 在尝试使用 docker 运行基于 pythonnet 的项目时,找不到 C# 运行时
    屏幕截图我不断收到此错误:RuntimeError:Failedtocreateadefault.NETruntime,whichwouldhavebeen"mono"onthissystem.Eitherinstallacompatibleruntimeorconfigureitexplicitlyvia......
  • Python 在模块中使用变量
    如何将一个文件中声明的变量调用到另一个文件中?大家好我已经在file1中声明了我的变量。我的函数位于file2中,它使用该变量。如何调用主文件中声明的变量。提前致谢当然可以!以下是如何在Python中跨文件使用变量:file1.py(包含变量的文件)#在file1.p......
  • Docker安装与使用
    Docker是一种开源的容器化技术,它使得开发者可以打包应用及其依赖项到一个标准化的单元(称为容器)中。Docker容器可以在任何环境中一致地运行,应用程序运行在虚拟容器里,如同在真实物理机上运行一样。Docker官网:https://www.docker.com/容器与虚拟机的区别:虚拟机:每个虚拟机都包......
  • Python 类型提示和 linter
    我一直在向我们的python项目添加静态类型检查,例如像这样:fromtypingimportListfromsomethingimportMyOtherClassclassMyClass:def__init__(self)->None:self.some_var=None#type:List[MyOtherClass]但是,现在我们使用的linter(flake8和......