Cythonized код python.net не может найти системные сборки

Когда я компилирую код Python, который использует python.net для доступа к сборкам .Net, он не может найти эти сборки. Без компиляции работает нормально.

Для демонстрационного кода я использовал https://github.com/pythonnet/pythonnet/blob/master/demo/helloform.py

Мой файл setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

ext_modules = [
    Extension(
        'helloform',
        sources = ['helloform.py'],
        language = 'c++'
      )
]

setup(
  name = 'helloform',
  ext_modules = cythonize(ext_modules),
)

Затем я создаю его с помощью python setup.py build_ext --inplace.

Я хотел загрузить скомпилированный модуль из приглашения Python с помощью import helloform, но это не удалось с

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "helloform.py", line 8, in init helloform
ModuleNotFoundError: No module named 'System'

person crayxt    schedule 14.08.2019    source источник


Ответы (1)


Этот ответ не проверен - я не думаю, что смогу легко настроить среду для тестирования, так что это своего рода предположение. Если не получится удалю.

Вероятно, это ошибка, и если вы хотите, чтобы она была исправлена ​​в долгосрочной перспективе, вы должны сообщить об этом . Cython действительно пытается быть совместимым с Python везде, где это возможно... Быстрое исследование показывает, что rel="nofollow noreferrer">Python.NET переопределяет встроенную функцию __import__. Cython ищет и использует эту функцию в Python 2, но не в Python 3. Это больше не является предпочтительным способом настройки импорта (но до сих пор поддерживается). Я предполагаю, что это будет работать в Cython + Python 2?

В качестве обходного пути вам, вероятно, следует просто запустить операторы импорта в Python. Есть два очевидных способа сделать это:

  1. Напишите небольшой отдельный модуль, содержащий только операторы импорта, а затем в Cython импортируйте из этого модуля:

    from import_module import WinForms, Size, Point
    
  2. Запустите операторы импорта в exec; извлеките значения из глобального словаря, который вы ему передаете:

    import_dict = {}
    exec("""import clr
    # etc...
    """, import_dict) # pass a dict in as `globals`
    WinForms = import_dict['WinForms']
    # etc.
    
person DavidW    schedule 18.08.2019
comment
Да, я уже тестировал отдельный модуль, вроде работает. Я поднял билет на страницу github pythonnet, спасибо - person crayxt; 19.08.2019
comment
Вместо этого я предлагал поднять это как ошибку Cython, поскольку Cython действительно стремится быть совместимым с Python, а это не совсем так. Возможно, это не будет исправлено быстро, но это всегда возможно... - person DavidW; 19.08.2019
comment
Готово, к сожалению, нет простого способа кросс-постить на Github ;) - person crayxt; 19.08.2019