我刚刚从 过渡到pipenv
,poetry
并且在从我在一些脚本中开发的本地包导入包时遇到问题。为了使这一点更具体,我的项目看起来像:
pyproject.toml
poetry.lock
bin/
myscript.py
mypackage/
__init__.py
lots_of_stuff.py
Run Code Online (Sandbox Code Playgroud)
之内myscript.py
,我import mypackage
。但是当我poetry run bin/myscript.py
得到一个时ModuleNotFoundError
,因为PYTHONPATH
不包括该项目的根。有了pipenv
,我可以通过PYTHONPATH=/path/to/project/root
在.env
文件中指定来解决这个问题,该文件将在运行时自动加载。导入带有诗歌的本地包的正确方法是什么?
我遇到了这篇关于使用环境变量的文章,但export POETRY_PYTHONPATH=/path/to/roject/root
似乎没有帮助。
我切换当前使用的一个项目pipenv
,以poetry
作为一个测试,看看差别是什么。该项目是一个简单的、可再分发的 Django 应用程序。它支持 Python 3.6-8,以及 Django 2.2 和 3.0。我有一个tox.ini
文件,涵盖了 Python 和 Django 的所有组合,因此:
[tox]
envlist = py{36,37,38}-django{22,30}
[testenv]
whitelist_externals = poetry
skip_install = true
deps =
django22: Django==2.2
django30: Django==3.0
commands =
poetry install -vvv
poetry run pytest --cov=my_app tests/
poetry run coverage report -m
Run Code Online (Sandbox Code Playgroud)
我遇到的问题(pipenv
世界上不存在)是该poetry install
语句将始终用文件中的任何内容覆盖该deps
部分中的任何内容poetry.lock
(如果它不存在,它将自动生成)。这意味着测试矩阵永远不会针对 Django 2.2 进行测试 - 因为默认情况下每个 tox virtualenv 都会安装 Django 3.0。
我不明白这应该如何工作 - 是否应该使用poetry
尊重正在安装的现有环境来安装依赖项?
所以 - 我的问题是 - …
我的主要开发机器是(Raspberry Pi) x86_64
,而我的一些部署环境是arm7vl
(Raspberry Pi)。对于大多数 Python 开发来说,这不是问题,但某些 Python 库仅在PyPI forx86_64
或piwheels for aarmv7l
. 这导致使用诗歌遇到一些困难。作为一个简单的示例,这是在计算机pyproject.toml
上创建的文件x86_64
:
[tool.poetry]
name = "poetrytest"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
[tool.poetry.dependencies]
python = "^3.9"
opencv-python = "^4.5.5"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)
相应的poetry.lock
文件包含从 PyPI 中提取的文件的哈希值,当您运行时,poetry install
一切都会按预期工作。 但是,如果将这两个文件复制到 Raspberry Pi,安装将无法找到合适的.whl
文件,因此会退回到尝试从源代码构建,这大约需要 2 小时并且失败:-(
要使其在 Pi 上工作,您需要将此块添加到pyproject.toml
:
[[tool.poetry.source]]
name = "piwheels"
url …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 python 包安装到BigSur macos 上的venv
using poetry
- 上。
我有稳定的 pyenv python
。
pyenv which python\n/Users/josh/.pyenv/versions/3.8.6/bin/python\n
Run Code Online (Sandbox Code Playgroud)\n当我执行时。
\n\n\n诗歌外壳 && 诗歌安装
\n
我收到此错误,但不知道该怎么办。
\n AttributeError\n\n module 'virtualenv.create.via_global_ref.builtin.cpython.mac_os' has no attribute \n'CPython2macOsArmFramework'\n\n at ~/.pyenv/versions/3.8.2/lib/python3.8/importlib/metadata.py:79 in load\n 75\xe2\x94\x82 """\n 76\xe2\x94\x82 match = self.pattern.match(self.value)\n 77\xe2\x94\x82 module = import_module(match.group('module'))\n 78\xe2\x94\x82 attrs = filter(None, (match.group('attr') or '').split('.'))\n 79\xe2\x94\x82 return functools.reduce(getattr, attrs, module)\n 80\xe2\x94\x82 \n 81\xe2\x94\x82 @property\n 82\xe2\x94\x82 def extras(self):\n 83\xe2\x94\x82 match = self.pattern.match(self.value)\n
Run Code Online (Sandbox Code Playgroud)\n欢迎任何解决问题的想法!
\nPoetry 有一个非常好的版本解算器,有时太好了:) 我试图在一个使用两个不兼容的包的项目中使用 Poetry。然而,它们仅通过声明是不兼容的,因为其中之一不再开发,但除此之外它们可以很好地协同工作。
使用 pip,我可以在一个环境中安装它们(打印错误)并且它可以工作。Poetry 将声明无法解析依赖项版本并拒绝安装任何内容。
有没有办法强制诗歌安装这些不兼容的依赖项?谢谢你!
Pip 支持该pyproject.toml
文件,但到目前为止,新模式的所有实际使用都需要一个 3rd 方工具来自动生成这些文件(例如,诗歌和 pip)。不像setup.py
已经是人类可写的,pyproject.toml
不是(还)。
[build-system]
requires = [
"setuptools >= 40.9.0",
"wheel",
]
build-backend = "setuptools.build_meta"
Run Code Online (Sandbox Code Playgroud)
但是,此文件不包含包依赖项(如 PEP 621 中所述)。Pip 确实支持使用安装包,pyproject.toml
但 pep 没有指定如何pyproject.toml
为官方构建系统编写包依赖项setuptools
。
我如何编写包依赖项pyproject.toml
?
相关的 StackOverflow 问题:
这个问题要求一种自动生成的方法pyproject.toml
,我的问题有所不同,因为我要求使用人工编写的pyproject.toml
.
setuptools python-packaging python-poetry pyproject.toml pep517
我正在将项目迁移到诗歌,但这里遇到了问题。这是一个简单的项目,不需要很多模块。我安装了诗歌,用于poetry add
添加一些所需的包然后运行poetry install
,但它似乎没有在我的 venv 中安装 pandas。我的pyproject.toml
看起来像这样:
[tool.poetry]
name = "***"
version = "0.1.0"
description = ""
authors = ["***"]
[tool.poetry.dependencies]
python = "^3.9"
pandas = "^1.2.2"
numpy = "^1.20.1"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
Run Code Online (Sandbox Code Playgroud)
然后我运行:
PS C:\****> poetry install
Installing dependencies from lock file
No dependencies to install or update
Run Code Online (Sandbox Code Playgroud)
最后,当我想运行使用 pandas 的 main.py 脚本时,它说没有名为 pandas 的模块:
PS C:\***> python main.py
Traceback (most recent call last):
File "C:\***\main.py", line 1, in …
Run Code Online (Sandbox Code Playgroud) 当我通过 激活虚拟环境时poetry shell
,GPG 签名会变得混乱,因为$GPG_TTY
是为父 shell 设置的。所以每次我用的时候poetry shell
我都要做GPG_TTY=$(tty)
。有没有办法自动执行此操作?理想情况下,我会在全球范围内设置一次,而不是为每个诗歌项目设置一次。
TL;DR:无法使用 WSL 中的现有 Poetry 环境在 PyCharm (Windows) 上配置 Python 解释器。当尝试在 下设置 Poetry 环境路径时Add Python Interpreter > Poetry Environment > Existing Environment
,所需的 Python 可执行文件根本不显示。我究竟做错了什么?
=================================================== ==
详细信息:
我在 Windows 11 上使用 PyCharm Pro 2021.3,Python 在 WSL2 (Ubuntu 20.04) 上运行。我正在尝试为我在 WSL2 上创建的现有 Poetry 环境添加一个 python 解释器,但它似乎不起作用。
PyCharm 目前对 Poetry 的支持是通过采用这个插件。根据我从插件的官方文档中收集到的信息,为了使用现有的 Poetry 环境定义解释器,我转到Python Interpreter > Add > Poetry Environment
,选择Existing environment
,然后输入该特定环境的路径:
为了找到该环境的路径,我运行“ poetry env info ”,它给出了以下模式的路径:
\\wsl$\Ubuntu-20.04\home\$USER$\.cache\pypoetry\virtualenvs\my-pretty-project-<some-hash>-py3.8\
在环境中运行时which python
,我看到 …
我有一个项目和一个用诗歌创建的现有虚拟环境(诗歌安装/init)。因此,据我所知,虚拟环境的目的是避免修改系统基础环境和隔离的可能性(每个项目、每个开发、每个系统等......)。
如何为我的诗歌项目创造另一个全新的环境?我最终如何复制和使用现有的?
我的意思是当前的(激活的)不应该参与其中(除了最终复制它),因为我想测试另一组依赖项和代码。
我知道这一点:
python-poetry ×10
python ×6
virtualenv ×3
armv7 ×1
django ×1
gnupg ×1
installation ×1
module ×1
package ×1
pep517 ×1
pycharm ×1
pyenv ×1
raspberry-pi ×1
setuptools ×1
tox ×1
tty ×1
ubuntu-20.04 ×1
wsl-2 ×1
x86-64 ×1