Setuptools 无法从 python 3.12.x 中的 pyproject.toml 读取requirements.txt

问题描述 投票:0回答:1

我的包结构如下:

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 来成功构建包。

此设置工具历史记录(第二点)表示很少有字段仍处于测试阶段。如何知道它们到底是什么?

如果我在这里做错了什么,请帮助我理解。

顺便说一句,我强烈倾向于仅使用 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. 安装设置工具,在 venv 中运行。但是,https://docs.python.org/3/whatsnew/3.12.html#ensurepip表示在 pip > 22.x 中不需要这种显式安装

  2. 参考这个SOQ:如何在setuptools项目的pyproject.toml中引用requirements.txt?指向requirements.txt是在版本62.6.0中引入的 某些功能仍处于测试版本https://setuptools.pypa.io/en/latest/history.html#v68-1-0

  3. 在依赖项中引入提及“文件”的 setuptools 版本https://github.com/pypa/setuptools/blob/v62.6.0/CHANGES.rst#v6260 当我在 [build-system] 表中使用相同版本时,我收到 ImpImporter is unavailable --issue is incompatibiltiy of setuptools v67.6.0 with Py 3.12 because ImpImporter is deprecated in 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 写入文件(不确定是否可能)或将我的 PC 的默认编码修改为 UTF-8

python-3.x setuptools python-packaging requirements.txt pyproject.toml
1个回答
0
投票

从@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())" 

© www.soinside.com 2019 - 2024. All rights reserved.