Как правильно скомпилировать программу на Python в бинарный файл
Я собираю программу на Python с использованием Cython следующим образом:
cython --embed myprg.py && gcc -Os -I /usr/include/python3.5m -o myprg myprg.c -lpython3.5m -lpthread -lm -lutil -ldl
Если я запускаю myprg, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "<frozen importlib._bootstrap>", line 890, in _find_spec
AttributeError: 'ModuleImporterFromVariables' object has no attribute 'find_spec'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "myprg.py", line 9, in init myprg (myprg.c:2219)
import json
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 954, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 892, in _find_spec
File "<frozen importlib._bootstrap>", line 873, in _find_spec_legacy
File "/usr/local/lib/python3.5/dist-packages/sh.py", line 3256, in find_module
while in_importlib(parent_frame):
File "/usr/local/lib/python3.5/dist-packages/sh.py", line 3204, in in_importlib
return frame.f_code.co_filename == "<frozen importlib._bootstrap>"
AttributeError: 'NoneType' object has no attribute 'f_code'
Моя программа на Python такая:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sh
import os
import traceback
import shutil
import sys
import json
print(sys.argv[1:])
Кажется, что скомпилированная программа не способна загрузить модуль json, в то время как другие модули работают хорошо. Некоторые тесты показали, что это также относится к модулю argparse.
Мой вопрос: почему это так и как я могу обойти / исправить это?
-
Дополнительные примечания:
Насколько я понимаю, после компиляции с помощью Cython двоичный файл будет использовать какой-то метод "sh.py" - часть пакета "sh". В этом пакете по какой-то причине метод проверяет импорт, используя следующий код:
""" helper for checking if a filename is in importlib guts """
return frame.f_code.co_filename == "<frozen importlib._bootstrap>"
Так как кажется, что стека фрейма, работающего с программой на основе выходных данных Cython, не существует, этот метод завершается ошибкой с исключением.
Насколько я знаю, эта ошибка не произошла некоторое время назад. Это новое. Похоже, что в python за последние месяцы что-то изменилось, что нарушает способ создания двоичного кода на cython. Кто-нибудь больше информации об этом?