setup.py 如何引用源代码库中的其他文件?
How can setup.py reference other files in the source repo?
我在获取 python 包以使用 python -m build .
构建时遇到问题。 setup.py
失败于:
FileNotFoundError: [Errno 2] No such file or directory: 'requirements/requirements.txt'
这是由于build
首先将文件复制到临时目录造成的。但它只是复制 source/
、README.md
、setup.py
、setup.cfg
。这不是复制 requirements/
.
出于复杂的原因,我的 setup.py 需要引用源代码库根目录中的其他文件 - 一个包含多个 requirements.txt 文件的目录。 不值得讨论为什么它需要以这种方式构建,我已经与同事进行了长时间的辩论。
当我们通过 pip install -e .
或作为 git 依赖项 git+ssh://...
安装包时,这工作正常,但在我们推送到 pypi 存储库之前构建时失败。
setup.cfg
setup.py
source/
source/my_package/
requirements/
requirements/requirements.txt
requirements/some-other-requirements.txt
setup.py 在调用 setup()
.
之前引用此目录
from pathlib import Path
from setuptools import setup, find_namespace_packages
requirements_dir = Path("requirements")
# This is the line that fails:
with (requirements_dir / "requirements.txt").open() as f:
install_requires = list(f)
setup(
packages=find_namespace_packages(where="source", include=["acme_corp.*"], exclude=["tests", "tests.*"]),
package_dir={"": "source"},
install_requires=install_requires,
extras_require=optional_packages,
)
build
在这里做正确的工作。构建源 dist 后,它会检查构建的结果是否可以实际安装。并且如果不将requirements
下的文件包含到source dist中,则source dist无法安装,因此无法使用。试试看:
$ python -m build --sdist # builds fine, but the tar is broken:
$ cd dist
$ tar tf pkg-0.0.1.tar.gz | grep requirements # will be empty
$ pip wheel pkg-0.0.1.tar.gz # will fail
Processing ./pkg-0.0.1.tar.gz
File was already downloaded
Preparing metadata (setup.py) ... error
ERROR: Command errored out with exit status 1:
command:
...
Complete output (9 lines):
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-req-build-wfzz27_k/setup.py", line 9, in <module>
with (requirements_dir / "requirements.txt").open() as f:
File "/usr/lib64/python3.9/pathlib.py", line 1252, in open
return io.open(self, mode, buffering, encoding, errors, newline,
File "/usr/lib64/python3.9/pathlib.py", line 1120, in _opener
return self._accessor.open(self, flags, mode)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip-req-build-wfzz27_k/requirements/requirements.txt'
要修复,请在源 dist 中包含 requirements
目录的 setup.py
旁边写一个 MANIFEST.in
。示例文件内容:
graft requirements
现在应该可以构建源 dist;您还可以验证 sdist 现在是否包含要安装的所有文件:
$ tar tf dist/pkg-0.0.1.tar.gz | grep requirements
pkg-0.0.1/requirements/
pkg-0.0.1/requirements/requirements.txt
...
这只涉及源 dist,因为 wheel 已经在主机(您的机器)上构建并且不再包含安装脚本。 Wheel 构建也将忽略 MANIFEST.in
文件。
我在获取 python 包以使用 python -m build .
构建时遇到问题。 setup.py
失败于:
FileNotFoundError: [Errno 2] No such file or directory: 'requirements/requirements.txt'
这是由于build
首先将文件复制到临时目录造成的。但它只是复制 source/
、README.md
、setup.py
、setup.cfg
。这不是复制 requirements/
.
出于复杂的原因,我的 setup.py 需要引用源代码库根目录中的其他文件 - 一个包含多个 requirements.txt 文件的目录。 不值得讨论为什么它需要以这种方式构建,我已经与同事进行了长时间的辩论。
当我们通过 pip install -e .
或作为 git 依赖项 git+ssh://...
安装包时,这工作正常,但在我们推送到 pypi 存储库之前构建时失败。
setup.cfg
setup.py
source/
source/my_package/
requirements/
requirements/requirements.txt
requirements/some-other-requirements.txt
setup.py 在调用 setup()
.
from pathlib import Path
from setuptools import setup, find_namespace_packages
requirements_dir = Path("requirements")
# This is the line that fails:
with (requirements_dir / "requirements.txt").open() as f:
install_requires = list(f)
setup(
packages=find_namespace_packages(where="source", include=["acme_corp.*"], exclude=["tests", "tests.*"]),
package_dir={"": "source"},
install_requires=install_requires,
extras_require=optional_packages,
)
build
在这里做正确的工作。构建源 dist 后,它会检查构建的结果是否可以实际安装。并且如果不将requirements
下的文件包含到source dist中,则source dist无法安装,因此无法使用。试试看:
$ python -m build --sdist # builds fine, but the tar is broken:
$ cd dist
$ tar tf pkg-0.0.1.tar.gz | grep requirements # will be empty
$ pip wheel pkg-0.0.1.tar.gz # will fail
Processing ./pkg-0.0.1.tar.gz
File was already downloaded
Preparing metadata (setup.py) ... error
ERROR: Command errored out with exit status 1:
command:
...
Complete output (9 lines):
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-req-build-wfzz27_k/setup.py", line 9, in <module>
with (requirements_dir / "requirements.txt").open() as f:
File "/usr/lib64/python3.9/pathlib.py", line 1252, in open
return io.open(self, mode, buffering, encoding, errors, newline,
File "/usr/lib64/python3.9/pathlib.py", line 1120, in _opener
return self._accessor.open(self, flags, mode)
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/pip-req-build-wfzz27_k/requirements/requirements.txt'
要修复,请在源 dist 中包含 requirements
目录的 setup.py
旁边写一个 MANIFEST.in
。示例文件内容:
graft requirements
现在应该可以构建源 dist;您还可以验证 sdist 现在是否包含要安装的所有文件:
$ tar tf dist/pkg-0.0.1.tar.gz | grep requirements
pkg-0.0.1/requirements/
pkg-0.0.1/requirements/requirements.txt
...
这只涉及源 dist,因为 wheel 已经在主机(您的机器)上构建并且不再包含安装脚本。 Wheel 构建也将忽略 MANIFEST.in
文件。