У меня есть структура пакета следующим образом:
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
Несколько ресурсов, которые помогли мне, пока я пытаюсь решить:
установка средств настройки, руль в венв. Но https://docs.python.org/3/whatsnew/3.12.html#ensurepip говорит, что в pip > 22.x нет необходимости в такой явной установке
Обратитесь к этому SOQ: Как ссылаться на файл require.txt в pyproject.toml проекта setuptools? указание на файл require.txt представлено в версии 62.6.0. Некоторые функции все еще находятся в бета-версии https://setuptools.pypa.io/en/latest/history.html#v68-1-0
Версия инструментов настройки, в которой в зависимостях появилось упоминание «файл» 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
Примечания к истории выпусков Setuptools https://setuptools.pypa.io/en/latest/history.html
Редактировать:
Из сообщений @ 9769953 я понял, что проблема связана с кодировкой моей системы Windows.
Наличие файла требований в кодировке UTF-8 решило проблему. Теперь проблема заключается в настройке команды pip freeze > requriements.txt
так, чтобы она записывала файл в формате UTF-8 (не уверен, возможно ли это) ИЛИ в изменении кодировки моего компьютера по умолчанию на UTF-8.
@ 9769953 Я попробовал обновить пип. но бесполезно. Не удалось вставить обратную связь из-за ограничения на количество символов. Любым другим путем?
Согласно проблемам на сайте github.com/pypa/setuptools/issues/3935, это было решено в setuptools 66.1. Я проверил вашу настройку и на 62.6.0 и 66.0 могу воспроизвести вашу ошибку. С setuptools 66.1 у меня проблем нет.
«UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xff в позиции 0: неверный начальный байт»: эта ошибка произошла бы, если бы у вас не было проблем и с 62.6; вряд ли это проблема, специфичная для setuptools. Поскольку вы используете Windows и здесь упоминается UTF-8, я рискну предположить, что ваша кодировка Windows или редактора — Latin-1 или что-то в этом роде, а не UTF-8.
@ 9769953, я только что попробовал с 66.1.0, но извините, проблема все еще сохраняется. и вы правы, теперь я получаю: UnicodeDecodeError: кодек 'utf-8' не может декодировать байт 0xff в позиции 0: неверный начальный байт
Да, проблема не сохраняется, вы просто получаете еще одну ошибку. О том, что см. также мой предыдущий комментарий. Или вы действительно получаете две ошибки одновременно: ошибку pkgutil и ошибку Юникода?
Для PyCharm в настройках -> Редактор проверьте настройки «Кодировки файлов», затем посмотрите, является ли глобальная кодировка и кодировка проекта UTF-8 («Системная настройка по умолчанию: UTF-8» также подойдет). Если они отличаются от UTF-8, это причина вашей проблемы с кодировкой.
Предупреждение — это всего лишь предупреждение: вы используете конфигурации, которые все еще находятся в стадии бета-тестирования. Вероятно, вам это подойдет, но если вы используете его для чего-то старше Python 3.12, это может быть не так.
@ 9769953 Нет, я попробовал все, что вы упомянули: изначально глобальная кодировка и кодировка проекта были разными. Я убедился, что они оба UTF-8
.
@9769953 Я сделал Default encoding for properties file
(в Editor -> File Encoding
), чтобы быть UTF-8
, а также Default Encoding
в Editor -> General -> Console
, чтобы быть UTF-8
И вы (пере)сохранили различные файлы? Та же ошибка все еще?
@ 9769953 Да, я пересохранил файлы и перезапустил PyCharm (на всякий случай, чтобы изменения вступили в силу). Но получаю ту же ошибку.
@ 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
Давайте продолжим обсуждение в чате.
Не могли бы вы также добавить полную трассировку ошибки Юникода? (Обратите внимание, что ваша первоначальная проблема решена; на самом деле это второй вопрос).
@ 9769953, чтобы соответствовать правилам SO и не вести долгое обсуждение в комментариях, я прошу вас продолжить обсуждение в чате. Кроме того, я добавил дополнительную информацию, которую вы запросили в этом чате.
Нет, никакого чата. Пожалуйста, дополните свой вопрос соответствующими деталями, а не в комментариях или чате. Вы можете удалять комментарии, которые больше не актуальны.
@ 9769953 Конечно, ознакомьтесь с редактированием.
pip freeze > requriements.txt
: где ты запускаешь эту команду?
@ 9769953 в терминале моей IDE (PyCharm)
@ 9769953 Кстати, используя pip freeze | python -c "import sys, codecs; sys.stdout = codecs.open('requirements.txt', 'w', 'utf-8'); print(sys.stdin.read())"
, я могу решить проблему. Цените любые альтернативы.
Проверьте локаль вашего терминала с помощью locale
; посмотрите, показывает ли это, что это UTF-8.
@ 9769953 Я проверил выходную кодировку моего терминала (powershell), используя [console]::OutputEncoding
. Я получил IBM437 в качестве имени тела и имя кодировки в качестве OEM United States.
терминал Powershell; но вы используете pip freeze
в терминале PyCharm?
@ 9769953 Да. В PyCharm я настроил C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
как путь к терминалу. Разве pip freeze
не должен запускаться в оболочке Power?
Любая оболочка/терминал, который с этим справляется, подойдет. Но да, эта кодировка может быть вероятной причиной. Я не знаю, как изменить кодировку PowerShell. Возможно, это связано с настройками ОС; возможно, вы захотите это изучить (для изменения этого может потребоваться перезапуск PyCharm или полная перезагрузка).
@ 9769953 да, проверю, как это сделать, в PS. Кстати, из любопытства, видите ли вы какие-либо проблемы на высоком уровне, если я использую тот, о котором упоминал выше? Потому что я считаю, что лучше использовать его/установить какой-то автоматический способ использования utf 8 в терминале pycharm, а не возиться с вещами на уровне ОС.
Судя по сообщениям @ 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())"
Вы искали ошибку? Вот первое попадание, которое я получил: stackoverflow.com/questions/77364550/…