首页 > 编程问答 >无法在 Jenkins 上使用来自不同文件夹/Poetry 环境的导入

无法在 Jenkins 上使用来自不同文件夹/Poetry 环境的导入

时间:2024-07-24 10:58:02浏览次数:14  
标签:python jenkins-groovy python-poetry

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

相关文章

  • Python 中的常量应该大写吗?
    在PEP8中,一般规则是在UPPER_CASE字符中声明常量。在现实生活中,可能有多种情况:#!envpythonDATABASE_HOST='localhost'app=Flask('myapp')base_two=partial(int,base=2)通常我们将字符串类型或数字类型变量视为不可变的,因此是常量,而不是对象或函数。问题是......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......
  • Python编程时输入操作数错误
    我正在用Python编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:matmul:输入操作数1没有足够的维度(有0,gufunc核心,签名为(n?,k),(k,m?)->(n?,m?)需要1)文件“D:\ÁreadeTrabalho\GitHub\TCC\CódigosMarcela\SistemaSISO_tres_estados_new.py”,......
  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......
  • Python项目流程图
    我有一个由多个文件夹组成的Python项目,每个文件夹包含多个脚本。我正在寻找一个Python库或软件/包,它们可以生成流程图,说明这些脚本如何互连并绘制出从开始到结束的整个过程。自动生成Python项目流程图确实是一个挑战,目前没有完美通用的解决方案。主要原因是:......
  • 使用 mypy 时Python中的继承和多态性不起作用
    我正在寻找用mypy做一些标准的多态性,我以前从未使用过它,而且到目前为止它并不直观。基类classContentPullOptions:passclassTool(Protocol):asyncdefpull_content(self,opts:ContentPullOptions)->str|Dict[str,Any]:...子类classGoogle......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......
  • python,替换标点符号但保持特殊单词完整的最佳方法
    我正在制作一个调制函数,它将采用带有特殊字符(@&*%)的关键字,并保持它们完整,同时从句子中删除所有其他标点符号。我设计了一个解决方案,但它非常庞大,而且可能比需要的更复杂。有没有一种方法可以以更简单的方式做到这一点。简而言之,我的代码匹配特殊单词的所有实例以查找跨度。然......
  • Python 检测 USB 设备 - IDLE 和 CMD 解释器之间的不同结果
    我正在尝试解决VDI解决方案中智能卡设备的USB重定向问题。我正在使用pyscard模块作为智能卡。对于进一步的上下文,主要问题是当浏览器插件调用用于处理智能卡的python脚本时,未检测到读卡器。关于问题,当我从CMD解释器运行此代码片段时,我收到空列表,表示系统上未找......