-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting on Windows, Linux, and OSX
欢迎来到 Windows、Linux 和 OSX 的 pythonnet 疑难解答 wiki !
如果有错误,首先要检查
Pythonnet 由两个 DLL 组成: clr.pyd (在 Linux 和 OSX 上为 clr.so 或 clr.dylib) 和 Python.Runtime.dll。第一个 DLL 用于通过 import clr
语句将 .NET 嵌入到 CPython 中,第二个 DLL 用于在 .NET 中嵌入 CPython。
pip install pythonnet [--pre] -U
(--pre 获取上传到 PyPI 的最新开发构建)
https://github.com/pythonnet/pythonnet/tree/master
注意,您需要安装 pip、wheel 和 setuptools。还需要安装 Windows SDK 或 Visual Studio (至少是免费版本),因为构建过程定位并使用 msbuild.exe
和 mt.exe
。
来自 Unmanaged Exports 的 RGiesecke.DllExport
不支持非英语 ILdasm 生成的 IL 文件。你可以使用 ILSPY 检查 RGiesecke.DllExport
来修复它。在 RGiesecke.DllExport.Parsing.Actions.DeleteExportAttributeParserAction.Execute
中查找并更改 “//代码” 为你的系统语言:
另一种解决方案是在构建 clrmodule
项目之前将系统语言改为英语。
编译符号的正确设置是由 UCS2
(Mono
为 UCS4
), x86
或 x64
版本的 CPython 和 Python 版本标记 (PYTHON2..PYTHON3
, PYTHON27..PYTHON36
) 来选择的。Visual Studio 从解决方案提供 Release/Debug
, Mono/Windows
, Python 2/3
, x86/x64
配置, 但是 PYTHON34..PYTHON36
标记需要在 Python.Runtime.csproj
和 clrmodule.csproj
项目属性中手动设置。
将 clr.pyd 和 Python.Runtime.DLL 复制到 PYTHONFOLDER\Lib\site-packages\
或包含它们的位置路径到搜索路径中。
如果您已经安装了 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 上安装,需要一些依赖项,例如:
- Mono-complete 或 Mono-devel (https://www.mono-project.com/download/stable/#download-lin), 至少版本 4.8
- clang (
sudo apt-get install clang
) - glib (
sudo apt-get install libglib2.0-dev
) - python-dev
确保可以通过 %PATH% 或 %PYTHONHOME% 环境变量访问已安装的 CPython。
Pythonnet 只依赖于从 CLR 4.0 开始添加的 DLR 和 Hashset。
在 CPython 文件夹 (例如 site-packages) 或 CLR 2/4 的 GAC 中没有遗留的 pythonnet 程序集。
确保所有 3 个 WinForms 演示都没有错误:
helloform.py
splitter.py
wordpad.py
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
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。
查看 stackoverflow、邮件列表归档和过去的 github 问题:
http://stackoverflow.com/questions/tagged/python.net
https://mail.python.org/pipermail/pythondotnet
https://github.com/pythonnet/pythonnet/issues
OSX: 请回顾这些在 Mac OSX 上的问题与常见的陷阱 OSX:
- Install pythonnet 2.3.0 on mac #525
- Can't install pythonnet with Mono 5 #470
- installing pythonnet on Mac Sierra #465
- Libraries missing after setup.py install on OSX #392
- Python.Runtime.dll.config under Mac OSX, Anaconda and brew mono #120
目前 (2017-11-20) 在 OSX 上安装 mono 有两种选择:
- Homebrew 用于构建 mono-5.0.1.1 的配方
-
Xamarin 最新的 Mono Mac 软件包,它也可以使用 Homebrew-Cask 安装,只要搜索
mono-mdk
, 或阅读 Caskroom 文档
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
你可能需要先 轻敲
酒桶。
$ 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 环境,请省略!