Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未定义的符号:PyExc_递归错误_Python_C++_Numpy_Cmake_Pybind11 - Fatal编程技术网

Python 未定义的符号:PyExc_递归错误

Python 未定义的符号:PyExc_递归错误,python,c++,numpy,cmake,pybind11,Python,C++,Numpy,Cmake,Pybind11,cmake的命令是: cmake_minimum_required(VERSION 2.8) project(testproject C CXX) set (CMAKE_CXX_STANDARD 14) set(CMAKE_VERBOSE_MAKEFILE OFF) set(CMAKE_JS_INC "$ENV{HOME}/.cmake-js/node-x64/v10.15.3/include/node;/home/project/code/node_modules/nan") set(C

cmake的命令是:

cmake_minimum_required(VERSION 2.8)
project(testproject C CXX)


set (CMAKE_CXX_STANDARD 14)
set(CMAKE_VERBOSE_MAKEFILE OFF)

set(CMAKE_JS_INC "$ENV{HOME}/.cmake-js/node-x64/v10.15.3/include/node;/home/project/code/node_modules/nan")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Release)

#------ PACKAGES ------
find_package(OpenCV 3 REQUIRED)
#---------------------------


#------ CORE ----
file(GLOB SOURCE_FILES "src/*.cpp" "src/*.h" "nan/*.cpp" "nan/*.h"
    "drivers/*.cpp" "drivers/*.h"
    "drivers/webstream/*.cpp" "drivers/webstream/*.h"
    )

add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC}
    PUBLIC "."
    )

set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
#---------------------------


#------ EVAL PACKAGES ------
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
#---------------------------
# c-python config
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/include/python3.5/")
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/lib/python3.5/")
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/local/lib/python3.5/")
include_directories(${PROJECT_NAME} SYSTEM PUBLIC "/usr/local/lib/python3.5/dist-packages/numpy/core/include/")
add_library(python_c SHARED IMPORTED)
set_target_properties(python_c PROPERTIES IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libpython3.5m.so")

target_link_libraries(
        ${PROJECT_NAME}
        PUBLIC python_c
)


#add_executable
add_executable(code pawan.cpp)
target_link_libraries(code
        PUBLIC python_c
        PUBLIC ${OpenCV_LIBS})
通过cmake,我还创建了一个可执行文件“代码”。可执行文件工作正常。使用通过cmake创建的代码库时会出现错误

这是pawan.cpp文件

cmake -DPYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3.5 ..
#包括“python3.5/Python.h”
#包括
#包括
使用名称空间std;
虚无乐趣(){

cout感谢完整的cmake文件。在这里,您构建的应用程序包括Python3.5并与之链接。但是,来自numpy的错误来自于
\u multiarray\u umath.cpython-38-x86\u 64-linux-gnu。因此
,所以是为Python3.8构建的,可能是在b/c环境中拾取的。c-exte为不同版本的CPython构建的版本通常不兼容

除非您特别需要Python3.5,否则我建议您确保在您的环境中正确设置它(即通过将
PATH
LD\u LIBRARY\u PATH
指向Python3.5版本)并且首先安装了numpy。但是如果3.8可以,您可以让cmake从环境中获取它。类似这样:

#include "python3.5/Python.h"
#include <iostream>
#include <string>

using namespace std;

void fun() {
    cout << "using cpython......................................................................00" << endl;
    Py_Initialize();
    PyRun_SimpleString ("print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11')");
//    if(PyArray_API == NULL){
//        _import_array();
//    }
    PyRun_SimpleString ("import numpy; print(numpy.__file__)");

    PyRun_SimpleString ("print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^22')");
}

并将“${PYTHON\u INCLUDE\u PATH}”添加到您的项目INCLUDE和“{code>”{$PythonLibs}”
将您的目标链接到。

欢迎使用Stackoverflow!请描述您已尝试如何解决此问题。您是否尝试了错误消息中列出的所有建议?@squareskittles按照您的建议更新了问题。PyExc_递归错误表示函数(在本例中可能是
导入
)调用自身,并且这样做的次数“太多”。在运行其他代码之前,是否使用pybind11(
pybind11::module::import(“numpy”)
)独立导入numpy?如果不是,是否调用numpy的初始化(
import\u array();
)?是否您也将文件命名为
numpy.py
?以上两个都给出了相同的错误。@WimLavrijsenSorry,麻烦了。我已经更新了问题。之前我添加了在尝试python3.8和后来添加的cmakelists.txt文件时出现的错误,当时我正在尝试python3.5。我已经更新了任务ion和它使用Python 3.5m,错误仍然存在。它选择的numpy也是Python 3.5m。我完全切换到了cpython api,但它仍然不工作。任何评论都会非常有用。期待答案。谢谢。老实说,我仍然打赌你在混合两个Python(3.5m和3.5),当您从
/usr
/usr/local
混合中获取包含和库时。这是什么
python-c“将distutils.sysconfig导入为sc;print(sc.get_config_var('incldirestomake')”
显示?(即目录匹配吗?)谢谢你的帮助。我发现有一些链接问题。中的解决方案对我有效。
#include "python3.5/Python.h"
#include <iostream>
#include <string>

using namespace std;

void fun() {
    cout << "using cpython......................................................................00" << endl;
    Py_Initialize();
    PyRun_SimpleString ("print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^11')");
//    if(PyArray_API == NULL){
//        _import_array();
//    }
    PyRun_SimpleString ("import numpy; print(numpy.__file__)");

    PyRun_SimpleString ("print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^22')");
}
find_package(PythonInterp)

if (PYTHONINTERP_FOUND)
   execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sys;sys.stdout.write(sys.version[:3])"
                   OUTPUT_VARIABLE PYTHON_VERSION)
   execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sys;sys.stdout.write(sys.prefix)"
                   OUTPUT_VARIABLE PYTHON_PREFIX)
   set (CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${PYTHON_PREFIX})
endif()

set(Python_ADDITIONAL_VERSIONS ${PYTHON_VERSION})
find_package(PythonLibs REQUIRED)

if (NOT PYTHONLIBS_FOUND)
   message(FATAL_ERROR "PythonLibs package not found and python component required")
endif()