Создайте VTK с привязками Python и CUDA, TBB и MPI в Windows

#python #vtk #cmake-gui

Вопрос:

Проблема

Я не могу загрузиться VTK в python on Windows с поддержкой CUDA , MPI , и TBB . Объемный рендеринг неоправданно медленный для производства с распределением PyPI по умолчанию (часы или более), и мне нужно использовать свое оборудование для ускорения вычислений.

Я успешно создал VTK 9.3.0 для Python 3.8.10-x64 с CMake и Visual Studio и bin , lib , include , и share папки и добавил их в PATH , но Python не видит vtk :

 Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import vtk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'vtk'
>>>
 

Я попытался разместить сгенерированные Lib/site-packages , bin , lib , и include папки в соответствующих местах C:Program FilesPython38 , но все равно получаю DLL ошибку загрузки:

 > py -3.8
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import vtk
Traceback (most recent call last):
  File "C:Program FilesPython38libsite-packagesvtkmodules__init__.py", line 13, in <module>
    from . import vtkCommonCore
ImportError: DLL load failed while importing vtkCommonCore: The specified module could not be found.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:Program FilesPython38libsite-packagesvtk.py", line 30, in <module>
    all_m = importlib.import_module('vtkmodules.all')
  File "C:Program FilesPython38libimportlib__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "C:Program FilesPython38libsite-packagesvtkmodules__init__.py", line 15, in <module>
    import _vtkmodules_static
ModuleNotFoundError: No module named '_vtkmodules_static'
>>>
 

Установка


ОС: Windows 10 Enterprise, x64-разрядная, Сборка 1909
Процессор: 2x Intel(R) Xeon(R) Gold 6248R
Диск: 2 ТБ NVMe M. 2 SSD
ОПЕРАТИВНАЯ ПАМЯТЬ: 192 ГБ DDR4
Вычислительные графические процессоры: 2x NVIDIA Quadro RTX8000 в режиме TCC с NVLink
Графический процессор дисплея: 1x NVIDIA Quadro RTX4000
Visual Studio: Сообщество Visual Studio 16 2019
10.0.19041.0 Windows SDK:, нацелен на 10.0.18363
Python: 3.8.10 x64-разрядный
3.21.1 CMake: (я использую CMake-GUI )
vcpkg: 2021-08-12
vtk-9.0.3-cp38-cp38-win_amd64 Источник VTK: (загрузка с веб-сайта VTK; не мастер GitHub)
Ссылка на GitHub VTKPythonPackage: (…не уверен, что мне это нужно…)
Инструментарий CUDA: 11.4
2021.3.0 TBB: (через базовый набор инструментов Intel(R) oneAPI)
2021.3.0 MPI: (через инструментарий Intel(R) oneAPI HPC)


ПРИМЕЧАНИЕ . При желании Embree, OSPRay и OpenVKL доступны в наборе средств визуализации Intel(R) oneAPI.

Подготовка


ПРИМЕЧАНИЕ: Есть много программ, которые необходимо загрузить, установить и настроить, и они важны для правильного построения. В попытке сократить этот пост до MRE (Минимальный воспроизводимый пример), пожалуйста, перейдите прямо к Steps to Reproduce разделу.

ПРИМЕЧАНИЕ . При настройке переменных среды может возникнуть ошибка, что длина ПУТИ больше 2047 не допускается. Чтобы преодолеть это препятствие, проще всего отредактировать путь непосредственно в реестре Windows. Откройте regedit как администратор, перейдите в

 ComputerHKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment
 

и установите Path переменную там.

СОВЕТ: Для редактирования PATH я копирую и вставляю из реестра в Word , затем выбираю и заменяю ; окончания абзацев ^p , выбирая Ctrl H , а затем используя Replace инструмент следующим образом:

Найти и заменить

Когда закончите, я просто отменю изменения, заменив ^p » s ; » на «s». Для меня это проще, чем бороться с регулярными выражениями.


1. Установите Visual Studio

  1. Загрузите установщик Visual Studio
  2. Запустите программу установки, выберите Visual Studio Community 2019 и выберите Desktop development with C . Убедитесь, что в Individual Components
  • Windows 10 SDK
  • C ATL for latest...
  • C MFC for latest...
  • C CMake tools for Windows

ПРИМЕЧАНИЕ: (Для меня на Windows 10 с Visual Studio 2019 , это v142 )

  1. Убедитесь, что путь к соответствующим bin папкам, lib , и include находится в поле PATH «из System Environment Variables «. Это может быть либо:
 C:Program Files (x86)Microsoft Visual Studio 14.0VCbin
C:Program Files (x86)Microsoft Visual Studio 14.0VClib
C:Program Files (x86)Microsoft Visual Studio 14.0VCinclude
 

и/или

 C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133binHostx64x64
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133libx64
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133include
 

ПРИМЕЧАНИЕ: (Я рекомендую как минимум последнее. )

  1. Убедитесь, что установщик установил следующие дополнительные параметры System Environment Variables :
 VS140COMNTOOLS=C:Program Files (x86)Microsoft Visual Studio 14.0Common7Tools
VS160COMCOMNTOOLS=C:Program Files (x86)Microsoft Visual Studio2019CommunityCommon7Tools
VS2019INSTALLDIR=C:Program Files (x86)Microsoft Visual Studio2019Community
VSSDK140INSTALLDIR=C:Program Files (x86)Microsoft Visual Studio 14.0VSSDK
 

NOTE: Even though the installer downloads these to Program Files (x86) , they are in fact the x64-bit programs (I know…Windows is weird…)

2. Install CUDA

  1. Download and run cuda_11.4.1_471.41_win10.exe (link)

TIP: The local installer will take longer to download, but your installs will run faster. I recommend saving the installer for the future anyway in case your CUDA Toolkit becomes corrupted or you need to install on another machine.

  1. Ensure the following are added to PATH in System Environment Variables
 C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.4bin
C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.4libnvvp
 

ASIDE: You MUST use version 11.4 for VTK 9 . However, as an aside, when using 10.2 in CMake, if CMake cannot find CUDA, this is probably because the CUDA Toolkit 10.2 installer for some reason does not copy the Visual Studio MSBuild Extensions over to your Visual Studio folder. Copy the files at

 C:Program FilesNVIDIA GPU Computing ToolkitCUDAv10.2extrasvisual_studio_integrationMSBuildExtensions
 

to

 C:Program Files (x86)Microsoft Visual Studio2019CommunityCommon7IDEVCVCTargetsBuildCustomizations
 

NOTE: If you want to run your GPU in TCC mode (WARNING: This disables graphics output), and/or if you have two GPUs connected via NVLink and want to activate NVLink, run the following command in command prompt:

 > nvidia-smi -i 0 -dm 1
> nvidia-smi -i 1 -dm 1
 

Assuming you have two GPUs with ID’s 0 and 1 you want to run in TCC mode. (To check, simply run nvidia-smi and see which GPUs you want to activate in TCC mode with the -dm switch). The PugetSystems Instructions have change with CUDA 11. NVIDIA’s newer drivers, which ship with the NVIDIA Control Panel, no longer have the Configure SLI, Surround, PhysX under 3D Settings , particularly if using a Quadro card rather than a GeForce card. Instead, NVLink will be activated once TCC mode is set, which disables graphics output. The program they have provided only works for CUDA 10, so you will get an error with it when using CUDA 11 even though it is enabled.

NOTE: If you get an error «Intel Graphics Driver for Windows not found», ignore it. You only need the drivers for the CPU.

NOTE: Don’t add more than the /lib/ and /libnvvp/ folders to path. CMake might not be able to find CUDA if you do. If you have to add other folders (e.g. CUPTI ), I recommend the lib/ and libnvvp/ folder appear FIRST in PATH.

3. Install CMake

  1. Download and install CMake (…that was easy)

4. Install vcpkg

  1. Download and configure vcpkg :
 cd C:
git clone https://github.com/microsoft/vcpkg
cd vcpkg
.bootstrap-vcpkg.bat
vcpkg integrate install
 
  1. Set the default triplet in the System Environment Variables to x64-windows :
 VCPKG_DEFAULT_TRIPLET=x64-windows
 
  1. Install ports using vcpkg install . Press Configure in CMake and every time it cannot find a dependency you want installed, search for the dependency with vcpkg search and install it with vcpkg install (to remove a package, use vcpkg remove )._

NOTE: BE AWARE that depending on what you install, these dependencies take A LOT of space and take A LONG TIME to download.

5. Install Intel oneAPI Toolkits

NOTE: These include TBB , MPI , OSPRay , and the Intel Fortran compiler ifort.exe , which you need.

  1. Intel(R) oneAPI Base Toolkit
  2. Intel(R) oneAPI HPC Toolkit
  3. Intel(R) oneAPI Rendering Toolkit (for Embree, OSPRay, and OpenVKL, optionally)

and add the corresponding lib , bin , and include folders to PATH .

6. Install Intel SPMD Compiler

  1. Intel(R) Implicit SPMD Program Compiler

7. Additional Dependencies with Installers

NOTE: You may not need or want need these. I am adding them here for completeness. If CMake complains about not finding these, I recommend installing them.

  1. Nullsoft Scriptable Install System
  2. WiX Toolset
  3. MySQL Community (GPL) Installer for Windows
  4. MySQL ODBC Connector
  5. Strawberry Perl

8. Dependencies that are Unsuccessful on Windows

ПРИМЕЧАНИЕ: Я пытался установить для них двоичные файлы и добавить их PATH , но они, похоже, просто не работают в Windows.

ПРИМЕЧАНИЕ: Для каждого из них вы также можете попробовать загрузить соответствующий исходный zip-файл python 3.8 (в GitHub, under выпусках , and on conda forge , under Files ) to a folder on C:`, а затем добавить вложенные bin папки, lib , include share , если доступно) в PATH System Environment Variable .

  1. OpenTurns 1.17
  2. GDAL 3.3.1

Шаги по воспроизведению

  1. Я поставил свою PATH первую. VTK сделаю bin , include , lib , и share папки, поэтому я удостоверяюсь, что они находятся в начале PATH . Вот что у меня есть (ПОДСКАЗКА: Обратитесь к настройке PATH , regedit чтобы избежать ошибки Windows с длиной пути более 2047 символов в разделе подготовки выше).
  2. Откройте x64 Native Tools Command Prompt for VS 2019 терминал от имени администратора и запустите
 > cmake-gui
 

Это обеспечивает vcvarsall.bat запуск и передачу соответствующих переменных среды, которые он устанавливает CMake-GUI .

  1. Установите для исходной папки C:VTKsrc значение, а для папки сборки-значение C:VTK

ОБНОВЛЕНИЕ 27-АВГ-2021:

Проблема заключалась в шаге 3. Папка сборки была ранее C:VTKbuild . Так и должно было быть C:VTK . Я исправил это.


  1. Нажмите Configure и выберите Visual Studio 16 2019 в качестве генератора с x64 дополнительной платформой: CMake01

ПРИМЕЧАНИЕ: Я не знаю, следует ли создавать библиотеки для VTK и CUDA для 32-разрядных версий. Я использую 64-разрядную версию в качестве своего лучшего предположения.

  1. После завершения настройки вы увидите множество переменных, что, по понятным причинам, ошеломляет, и неясно, в чем разница между DEFAULT , YES , NO WANT , и DON'T WANT . К сожалению, ответ скрыт в документах VTK CMake Module API Doxygen

API модуля VTK CMake

Включить Значения Состояния

На данный момент я оставляю все по умолчанию и редактирую следующие переменные CMake:

СОВЕТ: Grouped Advanced Установите флажки и рядом с Add Entry кнопкой, чтобы увидеть все переменные, сгруппированные по соответствующему проекту/модулю:

 CMAKE_CXX_MP_FLAG    Checked
CMAKE_INSTALL_PREFIX    C:/VTK
VTK_GROUP_ENABLE_Imaging    WANT
VTK_GROUP_ENABLE_MPI    WANT
VTK_GROUP_ENABLE_Qt    WANT
VTK_PYTHON_VERSION    3
VTK_SMP_IMPLEMENTATION_TYPE    TBB
VTK_USE_CUDA    Checked
VTK_USE_MPI    Checked
VTK_WRAP_PYTHON    Checked
VTK_ENABLE_KITS    Checked
 

и удалить

 Python2_EXECUTABLE
 

под Ungrouped Entries

  1. Повторите настройку
  2. Измените следующие переменные CMake:
 Python3_EXECUTABLE    C:/Program Files/Python38/python.exe
Python3_INCLUDE_DIR    C:/Program Files/Python38/include
Python3_LIBRARY    C:/Program Files/Python38/libs/python38.lib
 
  1. Повторите настройку
Вывод из 3-й настройки:
 Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.18363.
Found Python3: C:/Program Files/Python38/python.exe (found suitable version "3.8.10", minimum required is "3.2") found components: Interpreter Development.Module Development.Embed 
Configuring done
 
  1. Мои переменные CMake теперь выглядят так:

В СТОРОНЕ: Было бы неплохо, если бы графический интерфейс CMake имел возможность выводить переменные в текстовый файл, особенно для отладки…

В СТОРОНЕ: Было бы неплохо, если бы графический интерфейс CMake мог рассказать вам, что на самом деле было активировано/использовано, так как все отображается со DEFAULT значением, и мы не хотим это менять…

В СТОРОНЕ: было бы неплохо, если бы где-то был обзор высокого уровня того, что подразумевают все эти модули, чтобы пользователи могли понять, чего они хотят/в чем нуждаются…

Переменные CMake 01

Переменные CMake 02

Переменные CMake 03

Переменные CMake 04

Переменные CMake 05

Переменные CMake 06

Переменные CMake 07

  1. Щелчок Generate
Вывод из Generate
 Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.18363.
Configuring done
Generating done
 
  1. Откройте Visual Studio 2019 как администратор
  2. Откройте файл решения VTK.sln в C:VTKbuild
  3. Измените тип сборки с Debug на Release для скорости:

Режим выпуска

  1. Щелкните правой кнопкой мыши ALL_BUILD и выберите Build . В конце концов, на выходе получается
 ========== Build: 398 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
 
  1. Щелкните правой кнопкой мыши INSTALL и выберите Build . В конце концов, на выходе получается:
 ========== Build: 116 succeeded, 0 failed, 283 up-to-date, 0 skipped ==========
 

Вопрос

Пожалуйста, ознакомьтесь с проблемой в начале поста.

Обновление: 26-АВГ-2021

По предложению @JensMunk я скопировал VTK исходный код главной ветки для перезаписи vtkmodules/__init__.py с поддержкой os.add_dll_directory() , но безрезультатно:

 r"""
Currently, this package is experimental and may change in the future.
"""
from __future__ import absolute_import

import sys


def _windows_dll_path():
    import os

    _vtk_python_path = 'Lib/site-packages/vtkmodules'
    _vtk_dll_path = 'bin'
    # Compute the DLL path based on the location of the file and traversing up
    # the installation prefix to append the DLL path.
    _vtk_dll_directory = os.path.dirname(os.path.abspath(__file__))
    # Loop while we have components to remove.
    print("Folder Search:")
    print("==============")
    while _vtk_python_path not in ("", ".", "/"):
        # Strip a directory away.
        _vtk_python_path = os.path.dirname(_vtk_python_path)
        _vtk_dll_directory = os.path.dirname(_vtk_dll_directory)
        if _vtk_python_path != "C:\":
            print(_vtk_python_path)
    print("==============")
    print()
    _vtk_dll_directory = os.path.join(_vtk_dll_directory, _vtk_dll_path)
    print(f"VTK DLL Directory: {_vtk_dll_directory}")
    print()
    print("Adding DLLs...")
    if os.path.exists(_vtk_dll_directory):
        # We never remove this path; it is required for VTK to work and there's
        # no scope where we can easily remove the directory again.
        print(f"DLL: {_vtk_dll_directory}")
        _ = os.add_dll_directory(_vtk_dll_directory)

    print()
    print("Build tree...")
    # Build tree support.
    try:
        from . import _build_paths

        # Add any paths needed for the build tree.
        for path in _build_paths.paths:
            if os.path.exists(path):
                print(f"Path: {path}")
                _ = os.add_dll_directory(path)
    except ImportError:
        # Relocatable install tree (or non-Windows).
        print("Passing: Relocatable install tree")
        pass
    print()
    print("Imported!")


# CPython 3.8 added behaviors which modified the DLL search path on Windows to
# only search "blessed" paths. When importing SMTK, ensure that SMTK's DLLs are
# in this set of "blessed" paths.
if sys.version_info >= (3, 8) and sys.platform == "win32":
    _windows_dll_path()


# ------------------------------------------------------------------------------
# this little trick is for static builds of VTK. In such builds, if
# the user imports this Python package in a non-statically linked Python
# interpreter i.e. not of the of the VTK-python executables, then we import the
# static components importer module.
try:
    from . import vtkCommonCore
except ImportError:
    import _vtkmodules_static

# ------------------------------------------------------------------------------
# get the version
__version__ = "9.0.3"
 

При повторной попытке импорта я получаю ту же ошибку, поэтому библиотеки DLL все еще отсутствуют:

 Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import vtk
Folder Search:
==============
Lib/site-packages
Lib

==============

VTK DLL Directory: C:Program FilesPython38bin

Adding DLLs...
DLL: C:Program FilesPython38bin

Build tree...
Passing: Relocatable install tree

Imported!
Traceback (most recent call last):
  File "C:Program FilesPython38libsite-packagesvtkmodules__init__.py", line 69, in <module>
    from . import vtkCommonCore
ImportError: DLL load failed while importing vtkCommonCore: The specified module could not be found.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:Program FilesPython38libsite-packagesvtk.py", line 30, in <module>
    all_m = importlib.import_module('vtkmodules.all')
  File "C:Program FilesPython38libimportlib__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "C:Program FilesPython38libsite-packagesvtkmodules__init__.py", line 71, in <module>
    import _vtkmodules_static
ModuleNotFoundError: No module named '_vtkmodules_static'
 

Комментарии:

1. Начиная с Python 3.8 и далее, вам необходимо использовать os.add_dll_directory , чтобы разрешить python загружать библиотеки DLL из данного каталога. Вам необходимо добавить каталоги, содержащие библиотеку DLL VTK и все другие используемые библиотеки DLL, Qt, CUDA, MPI и т.д. Недостаточно добавить папки в ПУТЬ

2. Объемный рендеринг и CUDA не связаны.

3. @MathieuWestphal CUDA в стороне, будет VTK ли улучшен объемный рендеринг за счет создания с поддержкой распараллеливания?

4. @MathieuWestphal Также, я думаю, было бы более уместно сказать, что они не связаны «для VTK » (я знаю, что он использует/предпочитает OpenGL). Однако существует множество приложений объемного рендеринга с использованием CUDA. Вы можете найти их с помощью быстрого поиска в Google.

5. @JensMunk Не могли бы вы добавить примеры инструкций на VTK веб-сайте и/или странице GitLab, которые показывают, как это сделать?

Ответ №1:

Обновление: 26-АВГ-2021 (Продолжение…)

ПРИМЕЧАНИЕ: Это НЕ ответ.

В значительной степени делая то же самое, но vtk.py вместо этого, плюс включая все другие системные зависимости, использование os.add_dll_directory() не работает:

 """This is the vtk module."""

import sys

if sys.version_info < (3, 5):
    # imp is deprecated in 3.4
    import imp
    import importlib

    # import vtkmodules package.
    vtkmodules_m = importlib.import_module("vtkmodules")

    # import vtkmodules.all
    all_m = importlib.import_module("vtkmodules.all")

    # create a clone of the `vtkmodules.all` module.
    vtk_m = imp.new_module(__name__)
    for key in dir(all_m):
        if not hasattr(vtk_m, key):
            setattr(vtk_m, key, getattr(all_m, key))

    # make the clone of `vtkmodules.all` act as a package at the same location
    # as vtkmodules. This ensures that importing modules from within the vtkmodules package
    # continues to work.
    vtk_m.__path__ = vtkmodules_m.__path__
    # replace old `vtk` module with this new package.
    sys.modules[__name__] = vtk_m

else:
    if sys.version_info >= (3, 8):
        import os

        if os.name == "nt":
            WIN_DLLS = set([r"C:WINDOWSSystem32downlevel"])

            PY_ROOT = sys.exec_prefix
            PY_DLLS = set(
                [
                    os.path.join(PY_ROOT, "DLLs"),
                ]
            )

            try:
                VTK_DIR = os.environ["VTK_DIR"]
            except KeyError:
                VTK_DIR = None

            VTK_DLLS = set([])
            if VTK_DIR is not None:
                # Assumes default folder "bin" used in CMake configuration
                for root, dirs, files in os.walk(os.path.join(VTK_DIR, "bin")):
                    for file_ in files:
                        if file_.lower().endswith(".dll") or file_.lower().endswith(
                            ".pyd"
                        ):
                            if root not in VTK_DLLS:
                                VTK_DLLS.add(root)
                            break

            try:
                VULKAN_PATH = os.environ["VK_SDK_PATH"]
            except KeyError:
                VULKAN_PATH = None

            VULKAN_DLLS = set([])
            if VULKAN_PATH is not None:
                for root, dirs, files in os.walk(VULKAN_PATH):
                    for file_ in files:
                        if file_.lower().endswith(".dll"):
                            if root not in VULKAN_DLLS:
                                VULKAN_DLLS.add(root)
                            break

            try:
                CUDA_PATH = os.environ["CUDA_PATH"]
            except KeyError:
                CUDA_PATH = None

            CUDA_DLLS = set([])
            if CUDA_PATH is not None:
                for root, dirs, files in os.walk(CUDA_PATH):
                    for file_ in files:
                        if file_.lower().endswith(".dll"):
                            if root not in CUDA_DLLS:
                                CUDA_DLLS.add(root)
                            break

            try:
                ONEAPI_ROOT = os.environ["ONEAPI_ROOT"]
            except KeyError:
                ONEAPI_ROOT = None

            ONEAPI_DLLS = set([])
            if ONEAPI_ROOT is not None:
                for root, dirs, files in os.walk(CUDA_PATH):
                    for file_ in files:
                        if file_.lower().endswith(".dll"):
                            if root not in ONEAPI_DLLS:
                                ONEAPI_DLLS.add(root)
                            break

            try:
                ISPC_EXECUTABLE = os.environ["ISPC_EXECUTABLE"]
            except KeyError:
                ISPC_EXECUTABLE = None

            ISPC_DLLS = set([])
            if ISPC_EXECUTABLE is not None:
                ISPC_DLLS.add(os.path.dirname(ISPC_EXECUTABLE))

            # INCLUDE = os.path.join(PY_ROOT, "include")
            # LIB = os.path.join(PY_ROOT, "Lib")
            # SITEPACKAGES = os.path.join(PY_ROOT, "Lib", "site-packages")
            # LIBS = os.path.join(PY_ROOT, "libs")
            # SCRIPTS = os.path.join(PY_ROOT, "Scripts")

            dll_directories = [
                WIN_DLLS,
                PY_DLLS,
                VTK_DLLS,
                VULKAN_DLLS,
                CUDA_DLLS,
                ONEAPI_DLLS,
                ISPC_DLLS,
            ]

            print(f"WIN_DLLS: {WIN_DLLS}")
            print(f"PY_DLLS: {PY_DLLS}")
            print(f"VTK_DLLS: {VTK_DLLS}")
            print(f"VULKAN_DLLS: {VULKAN_DLLS}")
            print(f"CUDA_DLLS: {CUDA_DLLS}")
            print(f"ONEAPI_DLLS: {ONEAPI_DLLS}")
            print(f"ISPC_DLLS: {ISPC_DLLS}")

            for dll in dll_directories:
                if dll is not None:
                    for dll_ in dll:
                        os.add_dll_directory(dll_)

    import importlib

    # import vtkmodules.all
    all_m = importlib.import_module("vtkmodules.all")

    # import vtkmodules
    vtkmodules_m = importlib.import_module("vtkmodules")

    # make vtkmodules.all act as the vtkmodules package to support importing
    # other modules from vtkmodules package via `vtk`.
    all_m.__path__ = vtkmodules_m.__path__

    # replace old `vtk` module with the `all` package.
    sys.modules[__name__] = all_m
 

дает выход

 ❯ py
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import vtk
WIN_DLLS: {'C:\WINDOWS\System32\downlevel'}
PY_DLLS: {'C:\Program Files\Python38\DLLs'}
VTK_DLLS: {'C:\VTK\bin\Lib\site-packages\mpi4py', 'C:\VTK\bin', 'C:\VTK\bin\Lib\site-packages\vtkmodules'}
VULKAN_DLLS: {'C:\VulkanSDK\1.2.182.0\Tools', 'C:\VulkanSDK\1.2.182.0\Tools32\styles', 'C:\VulkanSDK\1.2.182.0\Third-Party\Bin32', 'C:\VulkanSDK\1.2.182.0\Tools\styles', 'C:\VulkanSDK\1.2.182.0\Tools32\iconengines', 'C:\VulkanSDK\1.2.182.0\Tools\imageformats', 'C:\VulkanSDK\1.2.182.0\Tools\platforms', 'C:\VulkanSDK\1.2.182.0\Tools32\bearer', 'C:\VulkanSDK\1.2.182.0\Bin32', 'C:\VulkanSDK\1.2.182.0\Tools\bearer', 'C:\VulkanSDK\1.2.182.0\Bin', 'C:\VulkanSDK\1.2.182.0\Third-Party\Bin', 'C:\VulkanSDK\1.2.182.0\Tools32', 'C:\VulkanSDK\1.2.182.0\Tools32\imageformats', 'C:\VulkanSDK\1.2.182.0\Tools\iconengines', 'C:\VulkanSDK\1.2.182.0\Tools32\platforms'}
CUDA_DLLS: {'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\visual_studio_integration\MSBuildExtensions', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\demo_suite', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\CUPTI\lib64', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\nvvm\bin', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\compute-sanitizer', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\libnvvp\plugins\org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140603-1326', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\bin'}
ONEAPI_DLLS: {'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\visual_studio_integration\MSBuildExtensions', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\demo_suite', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\extras\CUPTI\lib64', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\nvvm\bin', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\compute-sanitizer', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\libnvvp\plugins\org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140603-1326', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4\bin'}
ISPC_DLLS: {'C:\Program Files\ISPC\ispc-v1.16.1-windows\bin'}
Traceback (most recent call last):
  File "C:Program FilesPython38libsite-packagesvtkmodules__init__.py", line 13, in <module>
    from . import vtkCommonCore
ImportError: DLL load failed while importing vtkCommonCore: The specified module could not be found.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:Program FilesPython38libsite-packagesvtk.py", line 143, in <module>
    all_m = importlib.import_module("vtkmodules.all")
  File "C:Program FilesPython38libimportlib__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "C:Program FilesPython38libsite-packagesvtkmodules__init__.py", line 15, in <module>
    import _vtkmodules_static
ModuleNotFoundError: No module named '_vtkmodules_static'
>>>
 

Ответ №2:

Это тоже не ответ, а краткий рецепт того, что сработало для меня.

Я использую Python 3.8.8 из python.org — это не должно иметь никакого значения.

Я использую VTK-9.0.1 — до того, как они попытались устранить os.add_dll_directory проблему.

Я использую Qt5.15.2

Я не использую vcpkg

  1. Убедитесь, что найдены правильные библиотеки DLL
 In [1]: import sys
In [2]: sys.path.insert(0, "c:/{VTK_BUILD_DIR}/bin/Lib/site-packages/")
 
  1. Убедитесь, что они загружены и никаких ошибок не происходит (некоторые молчат).
 In [5]: import os
In [6]: os.add_dll_directory("c:/{VTK_BUILD_DIR}/bin/Lib/site-packages/vtkmodules/")
In [7]: os.add_dll_directory("c:/{VTK_BUILD_DIR}/bin/Release/")
In [8]: os.add_dll_directory("c:/QT/Qt5.15/5.15.2/msvc2019_64/bin/")

This is made on top of an empty virtual environment, where only ipython is added.

 

Ответ №3:

Я помещал свои сгенерированные файлы CMake в C:VTKbuild , а затем компилировал и устанавливал C:VTK , поэтому Python не мог найти библиотеки DLL. Я исправил соответствующий шаг в своем посте, чтобы инструкции по установке были полными и правильными.

См. раздел Steps to Reproduce , шаг 3