问题标签 [pythonnet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 为什么 .NET 的 Python 在构造函数期间持有全局解释器锁而不是方法调用?
我有几个用 C# 编写的类,我想从使用 Python for .NET 的 Python 编写的应用程序中使用它们。
之前使用 Python4Delphi 和 Python 的 C API 做过类似的事情,我知道为与 Python 交互的所有内容持有全局解释器锁 (GIL) 是多么重要,同时在长时间运行的操作期间释放它以便其他 Python 线程可以运行。
为了获得 GIL,Python for .NET 附带了方便的Py.GIL()
实用程序,我编写NoGil
它是为了让发布 GIL 变得同样容易。
我曾假设每当 Python 代码调用 C# 代码时,GIL 都会在调用期间保留。不过,似乎 GIL 在方法调用期间并未保留,而在构造函数调用期间则保留,如下面的示例所示。
这是 C# 类和我的NoGil
带有一些日志记录的实用程序类。为简单起见,我没有完全实现 Disposable 模式。
它在 Python 中使用(在通过 pip 安装了 pythonnet 包之后),如下所示:
输出是
我尝试使用 Python 2.7 和 3.6(均为 64 位)、适用于 .NET 的 Python 的最新版本 2.3.0 以及 .NET 4.0 和 4.6.1 作为我的目标框架。
问题:
- 这是 Python for .NET 中的预期行为还是我应该提交错误?
- 如果可以预期,我可以假设在调用 .NET 代码时持有 GIL 的情况到底是什么?我没有找到任何关于此的文档。
- 或者我不应该对 GIL 做任何假设,并且总是在必要时获取它(即通过委托调用 Python 代码时)?那么我如何确保在长时间的非 Python 操作期间不会持有它?
python - Pythonnet System.Object[,] 到 Pandas DataFrame 或 Numpy 数组
我正在使用 Pythonnet 调用一个 C# 函数,该函数返回一个 clr 对象(一个n x m矩阵)。在 python 中,类型是System.Object[,]。如何将此变量转换为 Pandas DataFrame 或更易于管理的东西?
谢谢你。
c# - C#调用Cpython的函数
这是我复制的代码,我想学习使用Python.Runtime,但是运行时抛出异常。
“DLL”python2.7m“无法加载:找不到指定的模块。(异常来自HRESULT:0X8007007E)。”
作为一个菜鸟的问题。谢谢你。
c# - 在 Python 中为 .NET 实现 C# 接口
我得到了一个用 C# 编写的库,我正在尝试使用 Python for .NET 调用它。
我需要一个实例的主类有一个构造函数,如:
没有实现该IGDhuSettings
接口的(公开的)类。当我创建一个 Python 类来实现它时,例如,
TypeError: interface takes exactly one argument
如果我没有__new__
方法或者我以正常方式定义一个方法,我会得到:
如果我尝试将接口实例化为一个类,我会得到相同的错误(没有或 >1 个参数),或者<whatever> does not implement IGDhuSettings
如果我将它传递给单个参数。
如果没有 CoClass(没有定义)或已经有一个实现它的类,我看不到一种在 Python 中实现 C# 接口的方法。
我在这里遗漏了一些细微差别,还是这是 Python for .NET 的限制?
GitHub上的讨论:https ://github.com/pythonnet/pythonnet/issues/674
c# - Python for .NET:如何使用同一 DLL 的不同版本显式创建 C# 类的实例?
我有一个 .cs 文件,例如
到目前为止,我将它与 PythonNET 一起使用,例如
我现在的问题是我需要使用具有相同名称且未设置版本号的 dll,因此 PythonNET 不会将它们视为两个不同的 dll,而是将它们视为相同的。即使我使用带有 AddReference 的完整路径导入它们。
现在我想明确地使用它们,如此处所述:
Python for .NET:在多个版本中使用相同的 .NET 程序集
喜欢
我尝试了很多方法来创建SomeClass
类似的实例
或者
或使用方法Initialize
或CreateInstance
或如以下链接中所述
最后一切都失败了,找不到东西,没有方法等等。
这样做的正确语法是什么?
c# - Python for .NET:如何使用反射调用静态类的方法?
我想使用静态类的方法。
这是我的 C# 代码:
如果它是一个“普通”类,我可以SomeMethod
使用
但是当我试图用静态类来做到这一点时
我怎么能解决这个问题?
python - 使用 pythonnet 导入 DLL
我正在尝试在 python 中导入和使用 DLL。因此我使用pythonnet。
但是代码会产生以下错误:
DLL 的目标运行时为:v4.0.30319
有什么方法可以找出导入失败的原因以及如何修复它?
(如有必要,我还可以提供 DLL)
.net - PyQt5 剪贴板不适用于 clr
我构建了一个运行 PyQt5 gui 并从外部 dll 读取 C# 数据的程序,当我from clr import AddReference
QApplication.clipboard 似乎不起作用时。
解决这个问题很容易,但我想知道这如何阻止剪贴板工作。
当我只导入 clr 时会出现这个问题
这个 clr 是从 pythonnet 项目安装的
任何信息都会很棒。
谢谢
python - Python for .NET:如何提供特殊类型的变量 (FTDI.FT_DEVICE_INFO_NODE[]) 作为方法参数
我想在 Python for .NET (pythonnet) 的帮助下使用 DLL。此 DLL 中的方法需要(指向?)变量作为参数。
我可以弄清楚如何调用方法并提供一个整数变量作为参数。
如果需要特殊类型,我不知道如何提供这样的参数变量(此处:FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE[])。
在使用不同的调用变体FTDI.GetDeviceList
(其中一些在技术上相同)时,我得到不同类型的错误:
TypeError:没有方法匹配给定的参数
FTDI.GetDeviceList([ftdi.FT_DEVICE_INFO_NODE()][:])
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE)
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE())
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE(device_count))
FTDI.GetDeviceList([devicelist_])
FTDI.GetDeviceList(devicelist_)
类型错误:不可索引的对象
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE()[:])
类型错误:预期类型
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE[:])
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE[1])
FTDI.GetDeviceList(ftdi.FT_DEVICE_INFO_NODE[0])
这是代码摘要和结果:
在这里,我发现了一些 c# 代码,其中 FT_DEVICE_INFO_NODE[] 和 GetDeviceList 在方法中使用:
FTDI.FT_DEVICE_INFO_NODE[]
作为参数提供给我有什么遗漏FTDI.GetDeviceList
?
FTDI 的 USB 驱动程序在此处下载:http ://www.ftdichip.com/Drivers/D2XX.htm,.Net包装器从此处下载:http: //www.ftdichip.com/Support/SoftwareExamples/CodeExamples /CSharp.htm
c# - 使用 C# dll 的 Pythonnet 运行时错误(数据库不兼容)
在此处输入图像描述我在 python 2.7.13(它使用其他 dll 文件和 .mdb 数据库文件)上使用 C# dll 使用 pythonnet 进行一些技术计算。这个 dll 文件没有很好的文档(只有命名空间、类和方法名)。好吧,大多数 PC 中的程序都可以正常工作,但在所有办公计算机中,它都会从 Dll 文件中引发运行时错误(我怀疑是与数据库的连接)。此 dll 文件被编译为面向 .NET 4.0(在办公计算机中安装了 .NET 4.7.1 或其他比 4.0 更新的版本)并且也正在使用 EntityFramework(程序面向 5.0,这是程序文件夹中的一个 dll 文件,但在办公电脑安装了EntityFramework 6.2工具)。Microsoft 数据库引擎 2010 也安装在这些计算机中。
在我测试过该程序的每一台其他计算机上,它都能完美运行。在办公室计算机中,我发现了一组程序适用的输入数据,但无论如何这是不正确的,因为它也应该适用于默认数据。
为了在办公计算机上进行测试,我使用 PyInstaller 编译了 python 代码(我重复一遍,编译版本在其他 PC 上工作正常)。
我正在使用 .NET Reflector 反编译 dll 文件和程序异常以查找错误。抛出异常的方法在下面的代码中。
提前致谢!