我正在使用 Poetry 来管理依赖项 - 不是作为打包工具。\n给出以下布局
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_module.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scripts\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_script.py\nRun Code Online (Sandbox Code Playgroud)\n在里面my_script.py我正在使用from src.my_module import MyClass,但是当我打电话时poetry run python scripts/my_script.py我得到:
\n\nModuleNotFoundError:没有名为“src”的模块
\n
我想将根目录添加到PYTHONPATH这个特定环境的目录中,但我想避免每次都手动导出它。
底线我正在寻找诗歌与vitualenvwrappers add2virtualenv的等效项
\n这在诗歌下可能吗?
\n假设您正在使用 Poetry 来管理 Python PyPI 包。目前,您的项目有一个Makefile包含管理项目安装、单元测试和 linting 的过程。然而,由于这违背了 Poetry 的精神,即理想情况下您有一个配置文件来统治所有这些 ( pyproject.toml),并且因为 saidMakefile在 Windows 构建上可能很烦人,所以您希望Makefile通过以下方式直接将功能移至由 Poetry 管理:利用Poetry 对setuptools脚本的支持。
这是这样一个示例Makefile:
PYMODULE := awesome_sauce\nTESTS := tests\nINSTALL_STAMP := .install.stamp\nPOETRY := $(shell command -v poetry 2> /dev/null)\nMYPY := $(shell command -v mypy 2> /dev/null)\n\n.DEFAULT_GOAL := help\n\n.PHONY: all\nall: install lint test\n\n.PHONY: help\nhelp:\n @echo "Please use \'make <target>\', where <target> is one of"\n @echo ""\n @echo " install install packages and …Run Code Online (Sandbox Code Playgroud) python directory-structure package build-script python-poetry
我正在开发一个 Python 包,我不想pip install .每次更改某些内容时都必须继续运行以重新安装我的包。除非我有文件,否则使用-eor--editable似乎不起作用setup.py,也没有--no-use-pep517。pyproject.toml如果我没记错的话,我有一个替代方案,这是现在的首选。那么,现在最好的方法是什么?
我的包只是一个 CLI 脚本,但它从同一目录中另一个名为utils.py. 开发时,我不能只从终端手动运行脚本,因为这样我会从行中得到“name_of_package不是一个包from name_of_package.utils import function” 。而如果我只有from utils import function,我可以从终端运行脚本,但是当我pip install运行时,它会说“没有名为utils”的模块。
我确实安装poetry并安装了我的依赖项,运行poetryshell,然后尝试使用 运行我的脚本poetry run /path/to/script.py,但我不断收到错误消息,指出我的包不是包。
我有一个托管在Google Cloud Platform ArtifactRegistry中的 Python 库。此外,我有一个使用Poetry 的Python 项目,它依赖于该库。
\n这是我的项目文件pyproject.toml:
[tool.poetry]\nname = "Test"\nversion = "0.0.1"\ndescription = "Test project."\nauthors = [\n "Me <me@mycompany.com>"\n]\n\n[tool.poetry.dependencies]\npython = ">=3.8,<4.0"\nmylib = "0.1.1"\n\n[tool.poetry.dev-dependencies]\n"keyrings.google-artifactregistry-auth" = "^1.1.0"\nkeyring = "^23.9.0"\n\n[build-system]\nrequires = ["poetry-core>=1.1.0"]\nbuild-backend = "poetry.core.masonry.api"\n\n[[tool.poetry.source]]\nname = "my-lib"\nurl = "https://us-east4-python.pkg.dev/my-gcp-project/my-lib/simple/"\nsecondary = true\n\nRun Code Online (Sandbox Code Playgroud)\n为了启用我的私有存储库,我安装了gcloud CLI并使用我的凭据进行了身份验证。因此,当我运行此命令时,我会看到正确的结果,如下所示:
\n$ gcloud auth list\nACTIVE ACCOUNT\n...\n* <my-account>@appspot.gserviceaccount.com\n...\nRun Code Online (Sandbox Code Playgroud)\n此外,我将Python 密钥环与keyrings.google-artifactregistry-auth一起使用,正如您在项目文件中看到的那样。
\n因此,通过此设置,我可以运行poetry install,使用 GCP 的身份验证从我的私有工件注册表下载依赖项。
当我尝试在 Docker 容器中应用相同的原则时,问题就出现了。
\n我创建了一个像这样的 …
python python-keyring gcloud python-poetry google-artifact-registry
我正在使用具有以下结构的 Poetry 开发 Python 包:
/packagename
/packagename
/tests
__init__.py
test_packagename.py
__init__.py
packagename.py
pyproject.toml
Run Code Online (Sandbox Code Playgroud)
所有的包代码都在 packagename.py 中,它以__init__.py.
我想添加一个 CLI,我的目标是在命令行中执行以下操作:
<packagename> <packagefunction>
Run Code Online (Sandbox Code Playgroud)
为此,我使用了 Python 的 click 包并将我的<packagefunction>内部写packagename.py为:
@click.command()
def packagefunction():
Run Code Online (Sandbox Code Playgroud)
目前,我已将入口点添加到诗歌配置文件中:
[tool.poetry.scripts]
<packagefunction> = '<packagename>:<packagefunction>'
Run Code Online (Sandbox Code Playgroud)
并运行:
poetry run <packagefunction>
Run Code Online (Sandbox Code Playgroud)
完美执行。
但是,我知道这不是正确的方法,我希望 CLI 使用上面显示的命令执行。
我想从poetry.lock文件安装包;使用poetry install。
然而,大多数包都会抛出完全相同的错误,这表明存在共同的基本问题。
\n是什么原因造成的?标准修复是什么?
\n规格:
\n终端:
\nrm poetry.lockpoetry updatepoetry installme@PF2DCSXD:/mnt/c/Users/user/Documents/GitHub/workers-python/workers/composite_key$ poetry update\nUpdating dependencies\nResolving dependencies... (217.2s)\n\nWriting lock file\n\nPackage operations: 55 installs, 8 updates, 0 removals\n\n \xe2\x80\xa2 Updating pyparsing (3.0.4 -> 2.4.7)\n \xe2\x80\xa2 Updating pyyaml (5.4.1 -> 6.0)\n \xe2\x80\xa2 Installing arrow (1.2.1)\n \xe2\x80\xa2 Installing chardet (4.0.0)\n \xe2\x80\xa2 …Run Code Online (Sandbox Code Playgroud) 我有两个 python 包。一种是 util 库,一种是将使用 util 库的应用程序(最终我将有更多应用程序共享该库。
path我对两者都使用诗歌,并且应用程序使用和属性将公共库指定为依赖项develop。
例如,我的布局看起来像这样:
- common/
- common/
- __init__.py
- py.typed
- pyproject.toml
- myapp/
- myapp/
- __init__.py
- py.typed
- pyproject.toml
Run Code Online (Sandbox Code Playgroud)
看起来myapp\pyproject.toml像这样:
[tool.poetry]
name = "myapp"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
[tool.poetry.dependencies]
python = "^3.9"
common = { path = "../common", develop = true }
[tool.poetry.dev-dependencies]
mypy = "^0.910"
flake8 = "^4.0.1"
black = {version = "^21.12b0", allow-prereleases = true}
pytest …Run Code Online (Sandbox Code Playgroud) 我尝试使用 Poetry 和脚本选项来运行脚本。就像这样:
\npyproject.toml
[tool.poetry.scripts]\nxyz = "src.cli:main"\nRun Code Online (Sandbox Code Playgroud)\n文件夹布局
\n .\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 poetry.lock\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 run-book.txt\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 cli.py\nRun Code Online (Sandbox Code Playgroud)\n然后我像这样执行安装:
\n\xe2\x9d\xaf poetry install\nInstalling dependencies from lock file\n\nNo dependencies to install or update\nRun Code Online (Sandbox Code Playgroud)\n如果我然后尝试运行该命令,则找不到(?)
\n\xe2\x9d\xaf xyz\nzsh: command not found: xyz\nRun Code Online (Sandbox Code Playgroud)\n我在这里错过了什么吗?谢谢,
\n我有一个简单的包,其中包含 C 扩展。我正在使用 Poetry 管理我的依赖关系和构建过程。
当我运行时poetry build,扩展被编译并包含在 .tar.gz 存档中,但不在 .whl 中,我不明白为什么。从 tar.gz 归档文件安装的 pip 按预期工作,但由于 Wheel 缺少 .so,pip 安装 Wheel 会导致软件包无法使用。
我已经从这里提升了构建机制:https ://github.com/python-poetry/poetry/issues/2740
pyproject.toml[tool.poetry]
name = "python_ctypes"
version = "0.1.0"
description = ""
authors = ["Me"]
include = [
{path = "_extensions/*.so", format = "wheel"}
]
[tool.poetry.dependencies]
python = "^3.9"
numpy = "^1.22.1"
[tool.poetry.dev-dependencies]
[tool.poetry.build]
generate-setup-file = false
script = "build.py"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)
build.py"""Poetry build script for python_ctypes"""
import os …Run Code Online (Sandbox Code Playgroud) 我使用poetry包管理器构建了一个包,但我后悔命名它,因为它听起来有点幼稚。
此外,由于poetry的默认行为是强制将项目名称更改为小写(SuperPackage--> superpackage),因此很难在包的主目录内部/外部导入包。
这是一个目录结构示例:
SuperPackage/
- superpackage/
- mysubpackage/
- __init__.py
- utils.py
- foo.py
- tests/
- __init__.py
- test_superpackage.py
- poetry.lock
- pyproject.toml
- README.md
- README.rst
- .gitignore
Run Code Online (Sandbox Code Playgroud)
由于这种结构,
SuperPackage/
- superpackage/
- mysubpackage/
- __init__.py
- utils.py
- foo.py
- tests/
- __init__.py
- test_superpackage.py
- poetry.lock
- pyproject.toml
- README.md
- README.rst
- .gitignore
Run Code Online (Sandbox Code Playgroud)
现在,我想SuperPackage改为nicepackage.
我该如何实现这一目标?我无法用谷歌搜索它,也许是因为它非常不常见或者太明显了。我应该更改文件"name"中的字段吗?pyproject.toml
但是,我不确定是否可以(并且建议)"name"直接更改字段。
[tool.poetry]
name …Run Code Online (Sandbox Code Playgroud) python-poetry ×10
python ×8
package ×2
build-script ×1
gcloud ×1
mypy ×1
pip ×1
python-click ×1
python-wheel ×1
setup.py ×1
setuptools ×1