`ModuleNotFoundError:在为包安装诗歌后,没有名为`的模块

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

我有一个包配置为在容器构建期间使用诗歌进行构建/安装。我不明白为什么

poetry install
说它已经安装了我的软件包,但没有找到它。然而,
poetry build
后跟轮子的
pip install
效果很好。如果包名称与根文件夹名称相同,是否需要指定子包,或者如何使用
poetry install
让诗歌安装完整包?我尝试了对
pyproject.toml
文件进行各种调整,包括设置
packages

文件结构如下所示:

.
└──  my_pkg
    ├── Dockerfile
    ├── pyproject.toml
    └── my_pkg
        ├── __init__.py
        └── app.py

pyproject.toml
文件如下所示:

[tool.poetry]
name = "my_pkg"
version = "0.1.0"
description = "My Package"

[tool.poetry.dependencies]
python = ">=3.8,<3.11"
...

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

问题是运行后没有安装该软件包

poetry install

%  poetry install
Installing dependencies from lock file

Package operations: 70 installs, 4 updates, 0 removals

   • Installing pyasn1 (0.4.8)
   • Installing cachetools (4.2.4)
   • Updating charset-normalizer (2.0.9 -> 2.0.8)
   • Installing frozenlist (1.2.0)
   • Installing multidict (5.2.0)
...


Installing the current project: my_pkg (0.1.0)

这会导致找不到包:

$ python
Python 3.9.9 (main, Dec  3 2021, 01:42:21) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_pkg
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'my_pkg'

如果我尝试查找实际文件,我找不到它们,但

pip
认为该软件包已安装。

$ find /usr/local -name my_pkg\*
/usr/local/lib/python3.9/site-packages/my_pkg.pth
/usr/local/lib/python3.9/site-packages/my_pkg-0.1.0.dist-info
$ ls -la /usr/local/lib/python3.9/site-packages/my_pkg-0.1.0.dist-info
total 32
drwxr-xr-x 2 root root  4096 Dec  8 15:32 .
drwxr-xr-x 1 root root 12288 Dec  8 15:32 ..
-rw-r--r-- 1 root root     6 Dec  8 15:32 INSTALLER
-rw-r--r-- 1 root root  1535 Dec  8 15:32 METADATA
-rw-r--r-- 1 root root   454 Dec  8 15:32 RECORD
$ cat /usr/local/lib/python3.9/site-packages/my_pkg.pth 
/app/my_pkg
$ pip freeze | grep my_pkg
my_pkg==0.1.0

这里,

/app/my_pkg
似乎是执行
poetry install
时代码所在的临时路径,但这不会保留在生成的容器中。

但是,当使用

poetry build && pip install dist/my_pkg*.whl
时,似乎包含了正确的包。所有
.py
文件也显示在
/usr/local/lib/python3.9/site-packages/my_pkg/
下。

Building my_pkg (0.1.0)
  - Building sdist
  - Built my_pkg-0.1.0.tar.gz
  - Building wheel
  - Built my_pkg-0.1.0-py3-none-any.whl
Processing ./dist/my_pkg-0.1.0-py3-none-any.whl
...
$ python
Python 3.9.9 (main, Dec  3 2021, 01:42:21) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import my_pkg
>>> 
python python-poetry
3个回答
17
投票

poetry install
将软件包安装到 venv 中。您必须先激活它,例如与
poetry shell
。也请查看 docs


5
投票

如果出于任何原因您真的需要诗歌在安装软件包时不创建虚拟环境,您可以添加以下内容:

poetry config virtualenvs.create false
poetry install

0
投票

我遇到了类似的问题,this问题的答案有帮助。希望它对其他人有帮助。基本都加了

[tool.poetry]
[... Your stuff]
packages = [{ include = "my_pkg" }]

这里是诗歌文档。 不要忘记在您的

__init__.py
中添加
/my_pkg
,否则将无法被识别。 如果您在 dockerfile 的 ENTRYPOINT 中启动模块,请使用点而不是 / 来引用您的 main.c 文件。例如:
my_pkg.main:app

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