Можете ли вы импортировать .so файл? - PullRequest
2 голосов
/ 26 июня 2019

У меня есть файл .so с именем tissue-classifier.cpython-37m-x86_64-linux-gnu.so из внешней библиотеки, который я хочу импортировать, чтобы я мог расширить его в одном из своих локальных классов. Поскольку я расширяю класс, мне нужно импортировать его как тип расширения, используя cimport, и мне интересно, возможно ли это вообще. Если я использую обычный оператор import, то у меня останется скомпилированная версия Python, которую нельзя использовать для расширения класса cdef в моем текущем файле.

Когда я пытаюсь cimport файл tissue_classifier, он выдает ошибку, что файл tissue_classifier.pxd не может быть найден, что имеет смысл, поскольку он находится в формате .so. Извините, если это глупый вопрос, я просто не мог понять это некоторое время.

1 Ответ

1 голос
/ 26 июня 2019

Нет, * .so-файл не может быть импортирован.

Если у вас есть C / CPP-фоны, тогда pyx / pxd / so-business легче всего понять, используя следующую модель:

  • Полученное расширение (*.so -файл) соответствует конечному артефакту в мире C / CPP, который может быть исполняемым файлом, общим объектом (*.so) или коллекцией библиотеки / объектного файла. Если вы просто запустите получившуюся программу, это все, что вам нужно. Например, вы можете использовать (и, вероятно, использовать) интерпретатор CPython, не создав его или не имея его исходного кода. По аналогии, если у вас есть двоичное расширение (*.so), вы можете импортировать и использовать его без необходимости его сборки (или даже наличия соответствующих pyx-файлов или компилятора на вашей машине) - это то, что предоставляется колесо .
  • *.pyx соответствует c / cpp-файлам, которые имеют определения функциональности. Эти файлы необходимы, если вы хотите построить полученный артефакт из источника. В мире C / CPP этот процесс сборки будет запускаться с использованием make или аналогичного. pyx-файлы необходимы, если вы устанавливаете пакет через python setup.py install - что соответствует вызову make.
  • *.pxd соответствует заголовкам (h / hpp-файлам): он описывает функциональность результирующих so-файлов, поэтому его можно использовать повторно. Например, одного лишь наличия CPython-интерпретатора недостаточно для создания расширений - нужно установить dev-версию, а также включить Python.h & Co. присутствуют в машине.

Так что же можно сделать?


Первая возможность:

Если авторы пакета считают *.pxd -файлы частью общедоступного API, они могут поместить соответствующие pxd-файлы рядом с * .so-файлами в установку , поэтому -интерфейс модуля может быть использован / расширен.

Если они не помещают pxd-файл в установку, высока вероятность того, что этот c-интерфейс является деталью реализации, и вам не следует его использовать, так как он может измениться без уведомления в будущем.

Тем не менее, можно рискнуть и скопировать необходимые pxd-файлы в установку для каждой руки, но сначала убедившись, что это правильная pxd-версия (то есть та же, что и для so-файлов в установке). были построены).

Вторая возможность:

Самый простой способ убедиться, что используется правильная pxd-версия, - это собрать пакет из исходного кода, т.е.

  • загрузка нужной версии из github (мастер или последняя версия)
  • звонит python setup.py install или то, что README говорит вам сделать

Теперь вместо копирования pdx-файлов в установку можно добавить include_path к загруженному пакетному источнику через include_path для функции cythonize или добавив его в sys.path.

В качестве альтернативы, как указал @BeforeFlight в комментариях, можно использовать python setup.py develop (или pip install -e ту же папку, чтобы ее можно было удалить), и поскольку вместо копирования данных создается ссылка, pxd- файлы будут найдены.


Приведенные выше решения помогут построить модуль, однако его распространение - это совсем другая история.

...