Как решить проблему с компиляцией .pyd в Nuitka, когда возникает ошибка «SyntaxError: invalid or missing encoding declaration»?

Я пытаюсь скомпилировать файл .pyd с использованием Nuitka версии 2.6.4. Я скомпилировал .pyd через Cython, выполнив следующую команду:  
```python
python setup.py build_ext --inplace
```
Вот код, который я использовал:  
```python
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("main.py", compiler_directives={"language_level": "3"})
)
```

Изначально я использовал Python версии 3.9.1 и выполнял команду:  
```bash
python3.9 -m nuitka --standalone --windows-console-mode=disable --enable-plugin=tk-inter main.cp39-win_amd64.pyd
```

Вывод, который я получил, был следующим:  
```
Nuitka-Options: Used command line options: --standalone --show-scons --windows-console-mode=disable
Nuitka-Options: --enable-plugin=tk-inter main.cp39-win_amd64.pyd
Nuitka: Starting Python compilation with Nuitka '2.6.4' on Python (flavor Unknown), '3.9' commercial grade 'not
Nuitka: installed'.
SyntaxError: invalid or missing encoding declaration for 'main.cp39-win_amd64.pyd'

Nuitka is very syntax compatible with standard Python. It is currently running
with Python version '3.9', you might want to specify more clearly with the use
of the precise Python interpreter binary and '-m nuitka', e.g. use this
'python3.13 -m nuitka' option, if that's not the one the program expects.
```

Я подумал, что, возможно, не указал кодировку, и добавил следующую строку:  
```python
# -*- coding: utf-8 -*-
set PYTHONIOENCODING=utf-8
```

Однако это не решило проблему. Я также попробовал установить Python 3.13 и 3.10, но результат остался прежним. 

Возможно, я что-то делаю неправильно, или Nuitka не поддерживает .pyd файлы? Можете ли вы помочь разобраться в данной ситуации?
  • 13 февраля 2025 г. 10:04
Ответы на вопрос 2
Ошибка, с которой вы столкнулись (`SyntaxError: invalid or missing encoding declaration`), возникает, когда Nuitka пытается интерпретировать файл `.pyd` как исходный код Python, а не как модуль C. Файлы `.pyd` обычно являются компилированными модулями и не интерпретируются Nuitka непосредственно.

Вот несколько шагов, которые могут помочь вам решить проблему:

1. **Не используйте .pyd с Nuitka**: Nuitka предназначен для компиляции исходного кода Python (.py). Файлы `.pyd` уже являются бинарными файлами и не должны компилироваться снова через Nuitka. Вместо этого используйте ваш .py файл.

2. **Компиляция только .py файла**: Если у вас есть файл `main.py`, вам нужно скомпилировать именно его. Используйте следующую команду:

    ```bash
    python -m nuitka --standalone --windows-console-mode=disable --enable-plugin=tk-inter main.py
    ```

3. **Убедитесь в корректности кода**: Проверьте ваш файл `main.py` на наличие синтаксических ошибок или проблем с кодировкой. Убедитесь, что у вас есть корректная строка кодировки в начале файла:

    ```python
    # -*- coding: utf-8 -*-
    ```

4. **Убедитесь, что вы используете правильную версию Python**: Убедитесь, что вы используете то же окружение Python, в котором вы устанавливали Nuitka и ваши зависимости. Можете запустить команду `python --version` для проверки.

5. **Проверьте настройки Cython**: Убедитесь, что с помощью Cython был правильно собран `.pyd` файл, если он необходим для вашего проекта.

Если вам нужно использовать механизмы Cython и Nuitka вместе, сначала компилируйте код на Cython в `.pyd` файл, а затем используйте сам `.py` файл для Nuitka. Не компилируйте `.pyd` с Nuitka напрямую.

Если проблема сохраняется, предоставьте больше информации о вашей среде (например, версии Python и Nuitka, структура проекта), чтобы мы могли помочь более детально.
Короче, извиняюсь за путаницу. Прочитал недостоверную инфу и повёлся. 
Итог таков, .pyd не компилиться в Nuitka
Nuitka работает только с .py и в C++/C сама уже собирает (для этого собственно и качается отдельно gcc mingw64) .
Изначально хотел сделать код более нечитабельным и сложно декомпилируемым, потому решил так заморочиться.

В общем, решил забить и нашёл в докумке аргументы для сборки, которые хотел воплотить с Cython.
--lto=yes --nofollow-import-to=unittest --nofollow-import-to=pytest --nofollow-import-to=pdb --assume-yes-for-downloads --remove-output --noinclude-pytest-mode=nofollow --noinclude-setuptools-mode=nofollow
Похожие вопросы