Как правильно скомпилировать программу на 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. Кто-нибудь больше информации об этом?

0 ответов

Другие вопросы по тегам