我的包结构如下:
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'?
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
在我尝试解决问题时,几乎没有资源可以帮助我:
安装设置工具,在 venv 中运行。但是,https://docs.python.org/3/whatsnew/3.12.html#ensurepip表示在 pip > 22.x 中不需要这种显式安装
参考这个SOQ:如何在setuptools项目的pyproject.toml中引用requirements.txt?指向requirements.txt是在版本62.6.0中引入的 某些功能仍处于测试版本https://setuptools.pypa.io/en/latest/history.html#v68-1-0
在依赖项中引入提及“文件”的 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
Setuptools 发布历史记录 https://setuptools.pypa.io/en/latest/history.html
编辑: 我从 @9769953 的输入了解到问题出在我的 Windows 系统的编码上。 使用 UTF-8 编码的需求文件解决了这个问题。现在,问题是配置
pip freeze > requriements.txt
命令以确保它以 UTF-8 写入文件(不确定是否可能)或将我的 PC 的默认编码修改为 UTF-8
从@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())"