Я пытаюсь настроить Cython, который скомпилирует исходный код Python в исполняемый файл (он должен включать основной метод внутри) - в настоящее время мне удалось настроить его как импортируемый модуль, но не как автономныйИсполняемый файл.
Я видел, что есть опция компилятора Options.embed
, которая должна обрабатывать это.(В этом сообщении сказано, что должно быть установлено значение функции, которую должен вызывать переводчик - main)
Это код модуля:
def main():
print('Cython Demo')
if __name__ == '__main__':
main()
Этоэто код установки "compile.py"
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
from Cython.Compiler import Options
Options.docstrings = False
Options.emit_code_comments = False
Options.embed = "main"
ext_modules = cythonize([
Extension("cython_demo.mymod.moduleA",["/home/myuser/PycharmProjects/cython_demo/mymod/moduleA.py"])],
compiler_directives=dict(always_allow_keywords=True,language_level = '3'))
setup(
name = 'My Program Name',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
К сожалению, после компиляции кода Python и попытки запустить исполняемый файл, вызвав:
./moduleA.cpython-36m-x86_64-linux-gnu.so
я получаю ошибку сегментации.
Segmentation fault (core dumped)
Я увидел, что основная функция есть, запустив grep "int main" для файла.В чем может быть проблема?
Когда я импортирую модуль откуда-то еще и запускаю main напрямую - он работает:
import moduleA
moduleA.main()
Спасибо!