Boost. Python TypeError: __init __ () должен возвращать None not 'NoneType' - но никаких очевидных проблем с компоновщиком или версией - PullRequest
1 голос
/ 27 апреля 2020

Я создаю движок c ++ для доступа python через интерфейсы повышения для установки python3 .7. Это построение для:

Mac OS Mojave  -  10.14.6
Python 3.7.4
Conda 4.8.3 (only crashes in a conda-built environment)
C++: clang version 11.0.0 (clang-1100.0.33.17)
Boost version 1.67.0

Код python не работает (насколько я могу судить) только в __init__ функциях с

Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: __init__() should return None, not 'NoneType'

Другие отчеты о переполнении стека (см. Biblio ниже) и потоки github предполагают, что типичной проблемой является неправильная ссылка в .dylibs между python версиями или нет ответов. Но несовместимость dylib здесь, похоже, не так. otool -L (или ldd) указывает, что привязки библиотеки согласованы и все должно быть хорошо. Вот код и этапы сборки.

Минимальный код (с небольшой функцией проверки в python версии):

#include <iomanip>
#include <patchlevel.h>
#include <boost/python/def.hpp>
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>

namespace R3 {
  class DistanceType {
  public:
    DistanceType(double _val = 0) : val(_val) {}
    double get() const { return val; }
    void set(double _val) { val = _val; }
  private:
    double val;
  };
  void pyversion() {
    int hexversion = PY_VERSION_HEX;
    std::cout << "compiled with python version: " << PY_VERSION
      << " (hex version code) " << std::hex << std::setw(8) << hexversion << '\n';
  }
}

BOOST_PYTHON_MODULE(simplepython) {
  using namespace boost::python;

  class_<R3::DistanceType>("DistanceType", init<double>())
    .add_property("value", &R3::DistanceType::get, &R3::DistanceType::set)
  ;

  boost::python::def("pyversion", R3::pyversion);
}

Вот результаты сборки и запуска кода:

>: g++ -I/opt/anaconda3/include/python3.7m -I/opt/anaconda3/include/python3.7m -O2 -fPIC -std=c++11  -Iinclude   -c -o objs/simplepython.o src/simplepython.cpp
>: g++ -Wl,-rpath,/opt/anaconda3/lib -shared -o lib/simplepython.so objs/simplepython.o -L/opt/anaconda3/lib -Llib -lpython3.7m -ldl -framework CoreFoundation -lboost_python37 -lboost_numpy37
>: cd lib
>: python -c 'import simplepython as R3; R3.pyversion(); R3.DistanceType(1)'
compiled with python version: 3.7.4 (hex version code)  30704f0
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: __init__() should return None, not 'NoneType'

Библиографические отчеты о проблемах переполнения стека:

TypeError: __init __ () должен возвращать None, а не NoneType с Python Boost

Является ли ошибка Boost :: Python (Python 3.7) "__init __ () должна возвращать None, а не NoneType" проблема с линковкой?

Boost. Python __init __ () должен возвращать None, а не NoneType

1 Ответ

0 голосов
/ 30 апреля 2020

Оказывается, ошибка связана со связанной библиотекой stati c, lib python <<em> version >. Для совместимости со средами conda и non-conda сборка c ++ / boost должна разрешать эти символы динамически. Следующие проблемы решили для меня:

В строке ссылки замените -lpython<version>m на -undefined dynamic_lookup.

Кредиты :

Первоначально Нехал Дж. Вани сообщил об этом решении, см. его ответ на этот вопрос .

ПРИМЕЧАНИЕ : я использовал $(shell python3-config --libs) для получения этих путей -l, которые, к сожалению, включают -l python <<em> версия > м; а с версии 3.8 на нее не будет. Из-за этого несоответствия я просто пока использую свои собственные расширенные данные.

Благодарность и благодарность : Nehal J Wani

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...