мой скрипт 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, и он работает, но двоичный файл слишком большой и медленный, не знаю, что мне делать
Разница в том, что по умолчанию Cython проверяет типы ваших аннотаций, поэтому они должны быть правильными. Вы можете отключить это с помощью директивы annotation_typing.
Также обратите внимание, что Cython --embed не объединяет зависимости (в отличие от pyinstaller), поэтому вы можете обнаружить, что действительно необходим дополнительный размер pyinstaller.
спасибо DavidW я добавил # cython: annotation_typing = False в начало моего файла, теперь двоичный файл работает, но некоторые функции нет, все функции, которые имеют что-то похожее, например это key_id: str = typer.Argument(None), issuer_name: str = typer.Option(None) не работают
Примечание: единственная функция, которая не работала после # cython: annotation_typing = False, содержащая что-то вроде этого key_id: str = typer.Argument(None), была из-за ошибки в написании.






Комментарий DavidW помог:
Разница в том, что по умолчанию Cython проверяет типы ваших аннотаций, поэтому они должны быть правильными. Вы можете отключить это с помощью директивы
annotation_typing.
Я добавил это в начало своего файла, и теперь это работает:
#cython: annotation_typing = False
#cython: language_level=3
Я собираюсь поставить setup.py для более организованного кода.
Итак, вы говорите, что тип должен быть
str, но на самом деле типArgumentInfoотtyper. Вы просто, кажется, используете неправильные типы