Файл Python отлично работает с командой python3, но при компиляции с cython перестает работать

мой скрипт Python отлично работает с командой python3. я используюcython main.py --embed для преобразования моего файла Python в файл C он выводит файл c и это:

/usr/lib/python3.11/site-packages/Cython/Compiler/Main.py:381: FutureWarning: Cython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: /home/solid/PythonAuthenticator/main.py   tree = Parsing.p_module(s, pxd, full_module_name)

затем я использую, чтобы превратить его в двоичный файл

PYTHONLIBVER=python$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')$(python3-config --abiflags) gcc -Os $(python3-config --includes) main.c -o pyauth $(python3-config --ldflags) -l$PYTHONLIBVER

но когда я запускаю двоичный файл, выведите это:

Traceback (most recent call last):
  File "main.py", line 87, in init main
    key_id: str = typer.Argument(None),
TypeError: Expected str, got ArgumentInfo

это часть функции, которая находится в строке 87 (я использую Typer для этой программы):

@app.command()
def show_code(
    key_id: str = typer.Argument(None), 
    issuer_name: str = typer.Option(None),
    e: bool = typer.Option(False, help = "Show TOTP code of a key outside key file.")
):
...

я использовал pyinstaller, и он работает, но двоичный файл слишком большой и медленный, не знаю, что мне делать

Итак, вы говорите, что тип должен быть str, но на самом деле тип ArgumentInfo от typer. Вы просто, кажется, используете неправильные типы

Andrew Ryan 21.04.2024 19:03

Разница в том, что по умолчанию Cython проверяет типы ваших аннотаций, поэтому они должны быть правильными. Вы можете отключить это с помощью директивы annotation_typing.

DavidW 21.04.2024 20:46

Также обратите внимание, что Cython --embed не объединяет зависимости (в отличие от pyinstaller), поэтому вы можете обнаружить, что действительно необходим дополнительный размер pyinstaller.

DavidW 21.04.2024 20:47

спасибо DavidW я добавил # cython: annotation_typing = False в начало моего файла, теперь двоичный файл работает, но некоторые функции нет, все функции, которые имеют что-то похожее, например это key_id: str = typer.Argument(None), issuer_name: str = typer.Option(None) не работают

altoensodio 21.04.2024 21:28

Примечание: единственная функция, которая не работала после # cython: annotation_typing = False, содержащая что-то вроде этого key_id: str = typer.Argument(None), была из-за ошибки в написании.

altoensodio 21.04.2024 21:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий DavidW помог:

Разница в том, что по умолчанию Cython проверяет типы ваших аннотаций, поэтому они должны быть правильными. Вы можете отключить это с помощью директивы annotation_typing.

Я добавил это в начало своего файла, и теперь это работает:

#cython: annotation_typing = False
#cython: language_level=3

Я собираюсь поставить setup.py для более организованного кода.

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