Проблема с встраиваемым питоном в c ++, скомпилированным node-gyp и вызванным из js - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать аддон cpp.js, который имеет встроенный python и другие библиотеки.

Когда я компилирую и запускаю код с помощью следующей команды, все равно perfect :

g++ -std=c++11 -Wall -O3 code_pred.cpp  -lstdc++fs -lpython3.6m  -I/usr/include/python3.6m/ `pkg-config --cflags --libs opencv` -o code_test

Затем я пытаюсь запустить то же самое через node-gyp configure build Он компилируется без проблем. Но когда я пытаюсь запустить его через js, он не может загрузить скрипт: import time #deleting this part has no effect on output #some simple var initializing print("HIIIIIIIII") И он возвращает это сообщение об ошибке (это ошибка времени выполнения Python):

ImportError: numpy.core.multiarray failed to import
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 24, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ImportError: /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so: undefined symbol: PyExc_ValueError

Original exception was:
ImportError: numpy.core.multiarray failed to import
HIIIIIIIIIIIIIIIIIIIIIII

Когда я пытаюсь импортировать другие библиотеки, такие как tenorflow, cv2 или даже больше ошибок типа , генерируется (аналогично вышеописанному), и печать больше не работает. Я думаю, что мой файл binding.gyp играет важную роль в этом. поэтому я делюсь этим здесь:

{
"targets": [
    {
        "target_name": "HWE",
        "dependencies": [

        ],    
        "include_dirs": [
            "<!(pkg-config --cflags opencv )",
            "<!(python3.6-config --cflags)",

            "<!(node -e \"require('nan')\")",
        ],

        "sources": [
            "./src/addon/addon.cpp"
        ],

        "cflags": ["-w", "-Wall", "-Wextra", "-pedantic", "-Wsign-compare", "-Wno-sign-compare"],
        "cflags_c": ["-std=c11", "-Wno-unused-parameter","-stdlib=libc++"],
        "cflags_cc": ["-std=c++11", "-fexceptions"],
        "cflags_cc!": ["-fno-rtti","-fno-exceptions" ],
        "conditions": [
            [   
                "OS=='linux'", {
                    'cflags': [
                        "<!(pkg-config --cflags opencv )",
                        "<!(python3.6-config --cflags)"
                              ],
                    # 'ldflags': [
                    #         "-Wl,-z,defs" 
                    #                                    ],
                    "libraries": [
                        "<!(pkg-config --libs opencv )",
                        "<!(python3.6-config --ldflags)",
                        "-lpython3.6m",
                        "-lpthread",
                        "-ldl",
                        "-lutil",
                        "-lm",
                        "-DPYTHON_LIBRARY",


                     ]
                }
            ],
            [
                'OS=="mac"', {
                    "link_settings": {
                        'ldflags': [
                            '-Wl',
                            '-L/usr/local/opt/opencv3/lib'
                        ],
                        "libraries": [
                            "-lopencv_core",
                            "-lopencv_highgui",
                            "-lopencv_videoio",
                            "-lopencv_imgcodecs",
                            "-lopencv_objdetect",
                            "-lopencv_imgproc",
                            "-lpython3.6m"
                        ]
                    },
                    'xcode_settings': {
                      'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
                      # 'OTHER_CFLAGS': [ '-O3', '-march=native', '-w' ],
                      'OTHER_CPLUSPLUSFLAGS' : ['-Wno-c++11-narrowing', '-Wno-sign-compare', '-std=c++11', '-stdlib=libc++'],
                      'OTHER_LDFLAGS': ['-stdlib=libc++','-L/usr/local/opt/opencv3/lib'],
                    }
                }
            ]
        ]
    }
]

}

Я использовал #include <python.h> для встраивания в него Python, а также #include <numpy/ndarrayobject.h>.

когда я удаляю строку #include <numpy/ndarrayobject.h> из кода C ++. скопированная ошибка (int над текстом) исчезает. Но как только импортируется тензор потока, я получаю подобные ошибки. заметки : Угадай: ошибка связана с динамическим связыванием библиотек ... У меня есть одна библиотека numpy с использованием pip3 на python3.6 и pip на python2.7.

У меня было несколько виртуальных сред, которые я тестировал в них (та же ошибка), а затем удалил. Я думаю, что это не связано с ними.

Я могу импортировать _ctypes или apt_pkg или numpy.core.multiarray или тензор потока и ... без ошибок в python.

Я проверил sys.path из кода, выполняемого js, а также автономный код, который генерирует оба: напечатаны почти одинаковые строки. Также протестировано platform.python_version() Обе показывает версию 3.6.7

Чтобы сообщить читателю:

  • Ubuntu v18.04.2
  • питоны v2.7.15rc1
  • Python v3.6.7
  • node-gyp v3.6.2
  • узел v8.10.0
  • npm v3.5.2
...