当我使用PythonNet从Python加载.Net类时,它没有为类填充python __ dict__,但是当我使用相同的命令序列从ipython加载它时,它确实如此。有谁能说如何从普通的Python中获取ipython行为?
非常感谢。
python -c "import clr; clr.AddReference('System.Windows.Forms'); import System.Windows.Forms; print len(System.Windows.Forms.__dict__)"
3
ipython -c "import clr; clr.AddReference('System.Windows.Forms'); import System.Windows.Forms; print len(System.Windows.Forms.__dict__)"
714
我在python 2.7.11和3.5.2中尝试过这个。 Pythonnet 2.0.0和2.1.0。我相信我使用的是CLR 4.0.30319(这是与其他人一起安装的)。
我认为ipython正在进行某种内省/反思,以找到Forms类/模块的成员,也许是为了完成/ intellisense。如何在常规Python中调用它?
这是一个打印内容的较长版本(根据denfromufa的要求) - 调用文件TestPN.py:
import clr
clr.AddReference('System.Windows.Forms')
import System.Windows.Forms
nCount = 0
for s, o in System.Windows.Forms.__dict__.items():
print(s, o, type(o))
nCount += 1
if nCount > 10:
break
各自的输出:
ipython TestPN.py
SelectionRange <class 'System.Windows.Forms.SelectionRange'> <class 'CLR.CLR Metatype'>
PropertyGrid <class 'System.Windows.Forms.PropertyGrid'> <class 'CLR.CLR Metatype'>
DataGridViewCellStyleConverter <class 'System.Windows.Forms.DataGridViewCellStyleConverter'> <class 'CLR.CLR Metatype'>
PrintPreviewControl <class 'System.Windows.Forms.PrintPreviewControl'> <class 'CLR.CLR Metatype'>
BindingManagerDataErrorEventArgs <class 'System.Windows.Forms.BindingManagerDataErrorEventArgs'> <class 'CLR.CLR Metatype'>
KeyPressEventArgs <class 'System.Windows.Forms.KeyPressEventArgs'> <class 'CLR.CLR Metatype'>
TableLayoutPanelCellPosition <class 'System.Windows.Forms.TableLayoutPanelCellPosition'> <class 'CLR.CLR Metatype'>
TreeViewImageIndexConverter <class 'System.Windows.Forms.TreeViewImageIndexConverter'> <class 'CLR.CLR Metatype'>
DrawListViewSubItemEventArgs <class 'System.Windows.Forms.DrawListViewSubItemEventArgs'> <class 'CLR.CLR Metatype'>
ItemChangedEventArgs <class 'System.Windows.Forms.ItemChangedEventArgs'> <class 'CLR.CLR Metatype'>
ToolStripItemRenderEventArgs <class 'System.Windows.Forms.ToolStripItemRenderEventArgs'> <class 'CLR.CLR Metatype'>
python TestPN.py
__name__ System.Windows.Forms <class 'str'>
__doc__ Namespace containing types from the following assemblies:
- System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
<class 'str'>
__class__ <class 'CLR.ModuleObject'> <class 'type'>
__file__ C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll <class 'str'>
python --version
Python 3.5.2
ipython --version
5.1.0
答案 0 :(得分:1)
答案是使用clr.setPreload(True)
import clr
clr.AddReference('System.Windows.Forms')
clr.setPreload(True)
import System.Windows.Forms
print(len(System.Windows.Forms.__dict__))
输出:
714
......根据需要。
import
语句的速度有点慢,正如您所料。