Poetry 和 Jenkins 问题:无法使用来自不同文件夹/Poetry 环境的导入
大家好,
我当前的设置遇到了涉及 Poetry 和 Jenkins 的问题。我正在尝试在我的脚本中实现 Poetry 并在 Jenkins 上运行它们,到目前为止还没有成功(第一次使用 Poetry)。
目录结构
这是我的目录结构的简化版本:
top_level/
├── helpers/
│ ├── __init__.py
│ └── helper_function.py
│ ├── poetry.lock
│ └── poetry.toml
│ └── pyproject.toml
|
└── xx/
└── xx/
└── xx/
└── src/
├── script.py
└── poetry.lock
├── poetry.toml
└── pyproject.toml
这是诗歌.toml的样子:
[virtualenvs]
create = true
in-project = true
prefer-active-python = false
问题
我正在从top_level/xx/xx/xx/src目录运行脚本,并尝试使用位于top_level/helpers目录中的一些辅助函数。但是,脚本无法识别来自 helpers 目录的导入。
这是我正在使用的 Jenkins 管道脚本(Poetry 已安装在节点上)并且它已经位于顶级目录中:
groovy
stage('Install Dependencies and Execute Script') {
steps {
ansiColor('xterm') {
script {
sh """
# Install dependencies for helpers
cd helpers
poetry install --no-root
# Back to the top_level directory
cd ..
# Export PYTHONPATH to include helpers directory
export PYTHONPATH="\$PWD/helpers"
# Install dependencies for the project
cd xx/xx/${folderName}
poetry install --no-root
# Run the script with Poetry
echo "Running the script..."
poetry run python -u src/main.py
"""
}
}
}
}
问题
如何正确配置Poetry和我的项目结构,以便A目录中的脚本能够识别并导入helpers目录中的帮助函数? 是否可以有多个 Poetry 环境?
有关如何解决此问题的任何意见或建议将不胜感激。
谢谢!
尝试
在纸面上这应该可行(?),但仍然有效从 helpers 文件夹导入的内容无法被识别。
在 Jenkins 上使用 Poetry 时遇到了常见问题。尝试在不同的 Poetry 环境中导入代码,但 Python 解释器无法识别这些路径。
以下是解决此问题的分步指南,以及说明:
1. 统一 Poetry 环境
与其为
helpers
和主项目维护单独的 Poetry 环境,不如创建一个统一的 Poetry 项目,其中包含所有必需的依赖项。 这简化了依赖管理并确保所有部分的代码都可以访问相同的库版本。
- 重组目录结构:
project_root/
├── helpers/
│ ├── __init__.py
│ └── helper_function.py
├── xx/
│ └── xx/
│ └── xx/
│ └── src/
│ └── script.py
├── poetry.lock
└── pyproject.toml
-
更新
pyproject.toml
:
将
helpers
目录添加到的
pyproject.toml
文件中,以便 Poetry 将其识别为项目的一部分:
```toml [tool.poetry] name = "your-project-name" version = "0.1.0" description = "" authors = ["Your Name [email protected] "]
[tool.poetry.dependencies] python = "^3.8" # ... other dependencies
[tool.poetry.dev-dependencies] # ... dev dependencies
[build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"
[tool.poetry.scripts] # If you want to run script.py directly with poetry run my-script = "xx.xx.xx.src.script:main" ```
2. 安装依赖项
在项目根目录下,运行以下命令安装所有依赖项,包括
helpers
的依赖项:
poetry install
3. 更新 Jenkinsfile
使用更新后的目录结构和统一的 Poetry 环境,的 Jenkinsfile 应如下所示:
pipeline {
agent any
stages {
stage('Install Dependencies and Execute Script') {
steps {
ansiColor('xterm') {
script {
sh """
#!/bin/bash
set -ex
cd project_root
# Install dependencies
poetry install --no-root
# Run the script with Poetry
echo "Running the script..."
poetry run my-script
"""
}
}
}
}
}
}
4. 相对导入
确保在
script.py
中使用相对导入来引用
helpers
模块中的函数:
# script.py
from ...helpers.helper_function import some_helper_function
# ... rest of your script
说明:
- 统一环境: 创建一个统一的 Poetry 环境可确保所有代码都使用相同的依赖项版本,从而减少冲突和错误。
- 相对导入: 相对导入通过相对于当前模块的位置指定模块或包的名称来帮助 Python 解释器找到正确的文件。
- Jenkinsfile: 更新后的 Jenkinsfile 现在直接从 Poetry 环境运行脚本,确保所有依赖项都可用。
通过执行这些步骤,将解决 Jenkins 上 Poetry 的导入问题,并创建一个更易于管理且不易出错的 Python 项目设置。
标签:python,jenkins-groovy,python-poetry From: 78786210