Если построить расширение на основе CFFI как
ffi = FFI()
ffi.cdef("...code...")
ffi.set_source("_example", "...code...")
ffi.compile()
создается файл скомпилированного расширения, например, в моей системе это "_example.cpython-36m-darwin.so"
.
Его можно импортировать в полукак, не зная полного имени файла как
sys.path.append(path)
from _example import lib
sys.path.pop()
Это почти безопасно, поскольку расширение FFI не изменяет sys.path
, и вряд ли это будет сделано в будущем. Тем не менее, было бы неплохо выполнить импорт без сохранения состояния через importlib
:
spec = importlib.util.spec_from_file_location(
"_example", path + "/_example.cpython-36m-darwin.so")
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
lib = mod.lib
Проблема в том, что требуется полный путь к файлу расширения. Есть ли какой-нибудь способ получить это полное имя, с зависимым от ОС суффиксом и расширением, зная только имя модуля ("_example"
), либо через cffi
, либо с помощью стандартных библиотечных средств?