2016-12-29 11 views
1

Когда я загружаю .NET-класс из Python с использованием PythonNet, он не заполняет python __ dict__ для класса, но когда я загружаю его из ipython, используя такая же последовательность команд. Может ли кто-нибудь сказать, как получить поведение ipython из простого Python?PythonNet - как заполнять __dict__ - ipython делает, python не

Большое спасибо.

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

Можете ли вы показать содержимое '__dict__' в обоих случаях? – denfromufa

ответ

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, как и следовало ожидать.