Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Troubleshooting on Windows, Linux, and OSX

LiJundang edited this page Dec 18, 2019 · 4 revisions

欢迎来到 Windows、Linux 和 OSX 的 pythonnet 疑难解答 wiki !

如果有错误,首先要检查

安装了最新的 pythonnet

Pythonnet 由两个 DLL 组成: clr.pyd (在 Linux 和 OSX 上为 clr.so 或 clr.dylib) 和 Python.Runtime.dll。第一个 DLL 用于通过 import clr 语句将 .NET 嵌入到 CPython 中,第二个 DLL 用于在 .NET 中嵌入 CPython。

从 PYPI

pip install pythonnet [--pre] -U (--pre 获取上传到 PyPI 的最新开发构建)

由 github 上的 master 分支构建

https://github.com/pythonnet/pythonnet/tree/master

注意,您需要安装 pip、wheel 和 setuptools。还需要安装 Windows SDK 或 Visual Studio (至少是免费版本),因为构建过程定位并使用 msbuild.exemt.exe

来自 Unmanaged ExportsRGiesecke.DllExport 不支持非英语 ILdasm 生成的 IL 文件。你可以使用 ILSPY 检查 RGiesecke.DllExport 来修复它。在 RGiesecke.DllExport.Parsing.Actions.DeleteExportAttributeParserAction.Execute 中查找并更改 “//代码” 为你的系统语言:

https://github.com/3F/DllExport/blob/master/RGiesecke.DllExport/Parsing/Actions/DeleteExportAttributeParserAction.cs#L17

另一种解决方案是在构建 clrmodule 项目之前将系统语言改为英语。

1. 在 Visual Studio 中构建

编译符号的正确设置是由 UCS2 (MonoUCS4), x86x64 版本的 CPython 和 Python 版本标记 (PYTHON2..PYTHON3, PYTHON27..PYTHON36) 来选择的。Visual Studio 从解决方案提供 Release/Debug, Mono/Windows, Python 2/3, x86/x64 配置, 但是 PYTHON34..PYTHON36 标记需要在 Python.Runtime.csprojclrmodule.csproj 项目属性中手动设置。

将 clr.pyd 和 Python.Runtime.DLL 复制到 PYTHONFOLDER\Lib\site-packages\ 或包含它们的位置路径到搜索路径中。

2. 从命令行构建和安装

如果您已经安装了 Visual Studio,运行 Developer Command Prompt for VS,因为它已经设置了所有的开发路径。否则,在尝试通过 pip 安装时,您可能会遇到 RuntimeError: mt.exe could not be found

如果安装了 GIT,执行: pip install git+https://github.com/pythonnet/pythonnet -U --force

注意,由于这个问题,临时需要 —egg 选项:

https://github.com/pythonnet/pythonnet/issues/555

或在本地 pythonnet 源目录: python.exe setup.py bdist_wheel 在运行时或使用环境变量时。

并且安装这个轮子:

pip install --no-index --find-links=.\dist\ pythonnet

注意,pip install wheel 是构建轮子的必要条件。

要在 Linux 上安装,需要一些依赖项,例如:

安装了 CPython 2.7-3.6

确保可以通过 %PATH% 或 %PYTHONHOME% 环境变量访问已安装的 CPython。

安装了 .NET 4.0+

Pythonnet 只依赖于从 CLR 4.0 开始添加的 DLR 和 Hashset。

没有遗留

在 CPython 文件夹 (例如 site-packages) 或 CLR 2/4 的 GAC 中没有遗留的 pythonnet 程序集。

3 WinForms 演示

确保所有 3 个 WinForms 演示都没有错误:

  • helloform.py
  • splitter.py
  • wordpad.py

nPython.exe 控制台应用程序工作

nPython.exe 展示了一个使用 pythonnet 在 C# 应用程序中嵌入 CPython 运行时的例子。

测试通过

通过运行以下命令,确保所有 Python 测试都在本地通过: pip install pytest python -m pytest.

注意,需要将 Python.Test.dll 复制到 PYTHONFOLDER\Lib\site-packages\

你还可以使用 Python.EmbeddingTest.dll 运行在 .NET 中嵌入 CPython 的 NUnit 测试。

阅读教程:

https://pythonnet.github.io https://github.com/pythonnet/pythonnet/blob/master/README.md

在 Python 导入和添加对 .NET 程序集的引用:

clr.AddReference("Assembly_Name") 通过查看不带 ".DLL" 的 "Assembly_Name" 来工作。

在 Python 中使用它之前,将 .NET 程序集路径 “Assembly_Name” 添加到 sys.path

import Namespace_In_CLR 的工作原理是在程序集 “Assembly_Name” 中导入 .NET 名称空间 “Namespace_In_CLR”,这是不同的!

公用错误

System.BadImageFormatException: 'Could not load file or assembly 'Python.Runtime...' - Python 和 .NET 架构 (x86、x64) 不匹配。

"Unable to load DLL pythonXX": 未安装 CPython,或未在 %PATH%%PYTHONHOME% 环境变量中注册 CPython。或者在初始化 Python 运行时之前设置 PythonEngine.PythonHome 属性。详情如下:

https://github.com/pythonnet/pythonnet/issues/259 https://github.com/pythonnet/pythonnet/issues/463 https://github.com/pythonnet/pythonnet/issues/467

回报

  • 报告错误的结果或异常并回溯

  • 报告最小可重现的异常或错误结果

  • Python、.NET / Mono 和 OS 的版本和 x86/x64 体系结构。

程序集绑定错误

当使用 pythonnet 的 .NET DLL 时,使用 fuslogvw.exe 分析程序集绑定错误。

当不确定 DLL 中的名称空间时,请为此使用 ILSPY

查看 history

查看 stackoverflow、邮件列表归档和过去的 github 问题:

http://stackoverflow.com/questions/tagged/python.net

https://mail.python.org/pipermail/pythondotnet

https://github.com/pythonnet/pythonnet/issues

OSX 笔记:

OSX: 请回顾这些在 Mac OSX 上的问题与常见的陷阱 OSX:

目前 (2017-11-20) 在 OSX 上安装 mono 有两种选择:

  1. Homebrew 用于构建 mono-5.0.1.1 的配方
  2. Xamarin 最新的 Mono Mac 软件包,它也可以使用 Homebrew-Cask 安装,只要搜索 mono-mdk, 或阅读 Caskroom 文档

Homebrew mono 配方安装说明:

  • brew install pkg-config
  • brew install glib --universal
  • brew install mono
  • Set PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/?.?.?/lib/pkgconfig
  • Manually add a symbolic link to the respective mono folder: /usr/local/your_python_path_here/lib

└─ $ ln -s /Library/Frameworks/Mono.framework/Versions/Current/lib/mono

  • export DYLD_LIBRARY_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib
  • USE_OSX_FRAMEWORKS=0 ARCHFLAGS="-arch x86_64" pip install git+https://github.com/pythonnet/pythonnet

Homebrew-Cask mono-mdk 安装说明:

你可能需要先 轻敲 酒桶。

$ brew update  # 更新 homebrew
$ brew install pkg-config  # 构建 PythonNET 需要 pkg-config
$ brew tap caskroom/cask  # 可能不需要
$ brew cask install mono-mdk

要构建 PythonNET for High Sierra,需要 PythonNET 的最新主分支。

$ git clone https://github.com/pythonnet/pythonnet
$ cd pythonnet/

寻找 mono-2.pc 在你 Mac 上的位置。

$ locate mono-2.pc  # 使用输出来设置 $PKG_CONFIG_PATH 和 mono 版本 

使用 mono-2.pc 的位置来替换 {mono version},以构建 Python 轮子。

$ PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/{mono version}/lib/pkgconfig/ python setup.py bdist_wheel

为你在 dist 文件夹中找到的 {cpython version}{mac version} 安装 {pythonnet version}:

$ pip install --user dist/pythonnet-{pythonnet version}-{cpython version}-{mac version}.whl

注意: 只有在将 Python 安装到 OSX 系统中时才需要 ——user 选项。如果使用虚拟或 conda 环境,请省略!