我正在尝试使用
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 代码。