Инструменты настройки не могут прочитать файл require.txt из pyproject.toml в Python 3.12.x

У меня есть структура пакета следующим образом:

program_root/
    - src/
    - tests/ 
    - data/
        - templates/
    - docs/         
    - pyproject.toml        
    - README
    - requirements.txt

Мой pyproject.toml:

[build-system]
requires = ["setuptools==62.6.0", "wheel"]
build-backend = "setuptools.build_meta"

[tool.setuptools]
package-dir = {"" = "src"}

[tool.setuptools.packages.find]
where = ["src"]

[tool.setuptools.package-data]
"*" = ["*.*"]

[project]
name = "file_ops"
version = "1.0.0"
authors = [
  {name = "abc", email = "[email protected]" },
]
dynamic = ["dependencies"]

[tool.setuptools.dynamic]
dependencies = {file = ["requirements.txt"]}

когда я пытаюсь собрать пакет, я продолжаю получать ошибку.

Я получаю следующую ошибку:
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?
Причина, по которой я специально использовал версию setuptools 62.6.0, заключается в том, что это версия, в которой setuptools ввел атрибут файла следующим образом:

dependencies = {file = ["requirements.txt"]}

Теперь, когда я просмотрел примечания к выпуску py 3.12, я узнал, что ImpImporter устарел.

Итак, использование некоторых других версий setuptools дает одну из следующих ошибок:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 
Backend subproccess exited when trying to invoke get_requires_for_build_sdist

Я понятия не имею, какую версию setuptools мне следует использовать сейчас для успешной сборки пакета.

В этой истории setuptools (2-й пункт) говорится, что несколько полей все еще находятся в стадии бета-тестирования. как узнать какие именно?

Пожалуйста, помогите мне понять, делаю ли я что-то не так.

Кстати, я настоятельно склонен использовать только файл toml для своих упаковочных нужд.

Вся трассировка моей первой ошибки:

* Creating isolated environment: venv+pip...
* Installing packages in isolated environment:
  - setuptools==62.6.0
  - wheel
* Getting build dependencies for sdist...
Traceback (most recent call last):
  File "D:\VAMSI-vectra\Vectra_work\jsonMerging\shared_libraries\vct_file_ops_root\venv_file_ops\Lib\site-packages\pyproject_hooks\_in_process\_in_process.py", line 373, in <module>
    main()
  File "D:\VAMSI-vectra\Vectra_work\jsonMerging\shared_libraries\vct_file_ops_root\venv_file_ops\Lib\site-packages\pyproject_hooks\_in_process\_in_process.py", line 357, in main        
    json_out["return_val"] = hook(**hook_input["kwargs"])
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\VAMSI-vectra\Vectra_work\jsonMerging\shared_libraries\vct_file_ops_root\venv_file_ops\Lib\site-packages\pyproject_hooks\_in_process\_in_process.py", line 302, in get_requires
_for_build_sdist
    backend = _build_backend()
              ^^^^^^^^^^^^^^^^
  File "D:\VAMSI-vectra\Vectra_work\jsonMerging\shared_libraries\vct_file_ops_root\venv_file_ops\Lib\site-packages\pyproject_hooks\_in_process\_in_process.py", line 70, in _build_backen
d
    obj = import_module(mod_path)
          ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Vectra\AppData\Local\Programs\Python\Python312\Lib\importlib\__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "C:\Users\Vectra\AppData\Local\Temp\build-env-kr3vu6_o\Lib\site-packages\setuptools\__init__.py", line 16, in <module>

    import setuptools.version
  File "C:\Users\Vectra\AppData\Local\Temp\build-env-kr3vu6_o\Lib\site-packages\setuptools\version.py", line 1, in <module>  
    import pkg_resources
  File "C:\Users\Vectra\AppData\Local\Temp\build-env-kr3vu6_o\Lib\site-packages\pkg_resources\__init__.py", line 2191, in <mo
dule>
    register_finder(pkgutil.ImpImporter, find_on_path)
                    ^^^^^^^^^^^^^^^^^^^
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

ERROR Backend subprocess exited when trying to invoke get_requires_for_build_sdist
(venv_file_ops) PS D:\VAMSI-vectra\Vectra_work\jsonMerging\shared_libraries\vct_file_ops_root

Несколько ресурсов, которые помогли мне, пока я пытаюсь решить:

  1. установка средств настройки, руль в венв. Но https://docs.python.org/3/whatsnew/3.12.html#ensurepip говорит, что в pip > 22.x нет необходимости в такой явной установке

  2. Обратитесь к этому SOQ: Как ссылаться на файл require.txt в pyproject.toml проекта setuptools? указание на файл require.txt представлено в версии 62.6.0. Некоторые функции все еще находятся в бета-версии https://setuptools.pypa.io/en/latest/history.html#v68-1-0

  3. Версия инструментов настройки, в которой в зависимостях появилось упоминание «файл» https://github.com/pypa/setuptools/blob/v62.6.0/CHANGES.rst#v6260 Когда я использовал ту же версию в таблице [build-system], я получал сообщение: ImpImporter недоступен — проблема связана с несовместимостью setuptools v67.6.0 с Py 3.12, поскольку ImpImporter устарел в версии 3.12 — см. это примечание к выпуску: https://docs.python.org/3/whatsnew/3.12.html#importlib

  4. Примечания к истории выпусков Setuptools https://setuptools.pypa.io/en/latest/history.html

Редактировать: Из сообщений @ 9769953 я понял, что проблема связана с кодировкой моей системы Windows. Наличие файла требований в кодировке UTF-8 решило проблему. Теперь проблема заключается в настройке команды pip freeze > requriements.txt так, чтобы она записывала файл в формате UTF-8 (не уверен, возможно ли это) ИЛИ в изменении кодировки моего компьютера по умолчанию на UTF-8.

Вы искали ошибку? Вот первое попадание, которое я получил: stackoverflow.com/questions/77364550/…

9769953 27.06.2024 13:24

@ 9769953 Я попробовал обновить пип. но бесполезно. Не удалось вставить обратную связь из-за ограничения на количество символов. Любым другим путем?

Devarapalli Vamsi 27.06.2024 13:29

Согласно проблемам на сайте github.com/pypa/setuptools/issues/3935, это было решено в setuptools 66.1. Я проверил вашу настройку и на 62.6.0 и 66.0 могу воспроизвести вашу ошибку. С setuptools 66.1 у меня проблем нет.

9769953 27.06.2024 13:58

«UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xff в позиции 0: неверный начальный байт»: эта ошибка произошла бы, если бы у вас не было проблем и с 62.6; вряд ли это проблема, специфичная для setuptools. Поскольку вы используете Windows и здесь упоминается UTF-8, я рискну предположить, что ваша кодировка Windows или редактора — Latin-1 или что-то в этом роде, а не UTF-8.

9769953 27.06.2024 14:00

@ 9769953, я только что попробовал с 66.1.0, но извините, проблема все еще сохраняется. и вы правы, теперь я получаю: UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xff в позиции 0: неверный начальный байт

Devarapalli Vamsi 27.06.2024 14:01

Да, проблема не сохраняется, вы просто получаете еще одну ошибку. О том, что см. также мой предыдущий комментарий. Или вы действительно получаете две ошибки одновременно: ошибку pkgutil и ошибку Юникода?

9769953 27.06.2024 14:03

Для PyCharm в настройках -> Редактор проверьте настройки «Кодировки файлов», затем посмотрите, является ли глобальная кодировка и кодировка проекта UTF-8 («Системная настройка по умолчанию: UTF-8» также подойдет). Если они отличаются от UTF-8, это причина вашей проблемы с кодировкой.

9769953 27.06.2024 15:57

Предупреждение — это всего лишь предупреждение: вы используете конфигурации, которые все еще находятся в стадии бета-тестирования. Вероятно, вам это подойдет, но если вы используете его для чего-то старше Python 3.12, это может быть не так.

9769953 27.06.2024 15:58

@ 9769953 Нет, я попробовал все, что вы упомянули: изначально глобальная кодировка и кодировка проекта были разными. Я убедился, что они оба UTF-8.

Devarapalli Vamsi 28.06.2024 06:20

@9769953 Я сделал Default encoding for properties fileEditor -> File Encoding), чтобы быть UTF-8, а также Default Encoding в Editor -> General -> Console, чтобы быть UTF-8

Devarapalli Vamsi 28.06.2024 06:29

И вы (пере)сохранили различные файлы? Та же ошибка все еще?

9769953 28.06.2024 10:26

@ 9769953 Да, я пересохранил файлы и перезапустил PyCharm (на всякий случай, чтобы изменения вступили в силу). Но получаю ту же ошибку.

Devarapalli Vamsi 28.06.2024 11:08

@ 9769953 новое: я пытался сделать это в коде VS: у меня открыт файл требований, и внизу, в синей полосе, написано, что это файл UTF-16LE. Я щелкнул по нему, и появилось два варианта: ReOpen с кодировкой и Сохранить с кодировкой. Я сделал: снова открыл с кодировкой и перешел в UTF-8. Затем мой файл приобрел необычную структуру: все символы были разделены символом NULL и двумя символами ? в начале. теперь, когда я строю, я получил: setuptools.extern.packaging.requirements.InvalidRequirement: Expected package name at the start of dependency specifier ��build==1.2.1

Devarapalli Vamsi 28.06.2024 11:18

Давайте продолжим обсуждение в чате.

Devarapalli Vamsi 28.06.2024 12:06

Не могли бы вы также добавить полную трассировку ошибки Юникода? (Обратите внимание, что ваша первоначальная проблема решена; на самом деле это второй вопрос).

9769953 28.06.2024 12:14

@ 9769953, чтобы соответствовать правилам SO и не вести долгое обсуждение в комментариях, я прошу вас продолжить обсуждение в чате. Кроме того, я добавил дополнительную информацию, которую вы запросили в этом чате.

Devarapalli Vamsi 28.06.2024 12:26

Нет, никакого чата. Пожалуйста, дополните свой вопрос соответствующими деталями, а не в комментариях или чате. Вы можете удалять комментарии, которые больше не актуальны.

9769953 28.06.2024 12:35

@ 9769953 Конечно, ознакомьтесь с редактированием.

Devarapalli Vamsi 28.06.2024 13:03
pip freeze > requriements.txt: где ты запускаешь эту команду?
9769953 28.06.2024 14:11

@ 9769953 в терминале моей IDE (PyCharm)

Devarapalli Vamsi 28.06.2024 14:23

@ 9769953 Кстати, используя pip freeze | python -c "import sys, codecs; sys.stdout = codecs.open('requirements.txt', 'w', 'utf-8'); print(sys.stdin.read())" , я могу решить проблему. Цените любые альтернативы.

Devarapalli Vamsi 28.06.2024 14:29

Проверьте локаль вашего терминала с помощью locale; посмотрите, показывает ли это, что это UTF-8.

9769953 28.06.2024 14:42

@ 9769953 Я проверил выходную кодировку моего терминала (powershell), используя [console]::OutputEncoding. Я получил IBM437 в качестве имени тела и имя кодировки в качестве OEM United States.

Devarapalli Vamsi 28.06.2024 14:55

терминал Powershell; но вы используете pip freeze в терминале PyCharm?

9769953 28.06.2024 15:15

@ 9769953 Да. В PyCharm я настроил C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe как путь к терминалу. Разве pip freeze не должен запускаться в оболочке Power?

Devarapalli Vamsi 28.06.2024 15:30

Любая оболочка/терминал, который с этим справляется, подойдет. Но да, эта кодировка может быть вероятной причиной. Я не знаю, как изменить кодировку PowerShell. Возможно, это связано с настройками ОС; возможно, вы захотите это изучить (для изменения этого может потребоваться перезапуск PyCharm или полная перезагрузка).

9769953 28.06.2024 15:48

@ 9769953 да, проверю, как это сделать, в PS. Кстати, из любопытства, видите ли вы какие-либо проблемы на высоком уровне, если я использую тот, о котором упоминал выше? Потому что я считаю, что лучше использовать его/установить какой-то автоматический способ использования utf 8 в терминале pycharm, а не возиться с вещами на уровне ОС.

Devarapalli Vamsi 28.06.2024 16:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
27
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Судя по сообщениям @ 9769953, я могу понять проблему. При создании файла требований с помощью команды pip freeze > requirements.txt файл кодируется в UTF-16 LE (в вашем случае это может быть по-другому). поэтому, если кодировка отличается от UTF-8, скорее всего, это может быть основной причиной.

Я вручную скопировал файл требований в Блокнот и на вкладке Encoding выбрал UTF-8 -> сохранил и переместил файл в фактическое местоположение (место, где должен находиться файл требований), после чего проблема решена.

Итак, чтобы программно настроить кодировку команды pip freeze, я использовал следующее: python pip freeze | python -c "import sys, codecs; sys.stdout = codecs.open('requirements.txt', 'w', 'utf-8'); print(sys.stdin.read())"

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