如何配置python3 venv,以便相对导入在Jenkins freestyle项目中正常工作?

我有一个Jenkins工作,从我的Jenkins项目WORKSPACE中的不同Gitlab存储库中提取python文件。其中一些脚本应该由其他人导入,但我在使用相对导入时遇到了错误。


值错误:尝试在顶级包之外进行相对导入


script1.py


from ..script2/script2 import foo

script2.py


def foo():

    print('Foo!')

文件/目录层次结构


/var/lib/jenkins/workspace/project_name

    script1/

        script1.py

    script2/

        # script2.py contains 'foo' function

        script2.py

Jenkins 'Execute shell' build step


#!/bin/bash


python3 -m venv ${WORKSPACE}/venv

. ${WORKSPACE}/venv/bin/activate


python ${WORKSPACE}/script1/script1.py 

我错过了什么?


开心每一天1111
浏览 168回答 1
1回答

慕运维8079593

理想情况下,测试应在“清洁环境”中进行。因此,与其使用相对导入运行脚本测试,不如编写一个以模块形式在本地安装项目。然后,您可以编写单独的测试,您可以在其中执行。setup.pyfrom mymodule import script1.script1如果你走这条路,你需要决定一个项目结构。没有最好的结构(见这里)。举个例子,这是我的典型结构:├── src/│&nbsp; &nbsp;├── script1/│&nbsp; &nbsp;│&nbsp; &nbsp;└── script1.py│&nbsp; &nbsp;└── script2/│&nbsp; &nbsp; &nbsp; &nbsp;└── script2.py├── tests/│&nbsp; &nbsp;├── test_script1.py│&nbsp; &nbsp;└── test_script2.py└── venv/以及如下 setup.py:import osfrom setuptools import find_packages, setup# load desc from readmedef read(fname):&nbsp; &nbsp; return open(os.path.join(os.path.dirname(__file__), fname)).read()setup(&nbsp; &nbsp; name="mymodule",&nbsp; &nbsp; version="0.0.1",&nbsp; &nbsp; author="you",&nbsp; &nbsp; author_email="<you@you.com>",&nbsp; &nbsp; description=("short description"),&nbsp; &nbsp; license="<none>",&nbsp; &nbsp; packages=find_packages("src"),&nbsp; &nbsp; package_dir={"": "src"},&nbsp; &nbsp; long_description=read("README.md"),&nbsp; &nbsp; classifiers=[&nbsp; &nbsp; &nbsp; &nbsp; "Development Status :: 2 - Pre-Alpha",&nbsp; &nbsp; &nbsp; &nbsp; "Topic :: Utilities",&nbsp; &nbsp; &nbsp; &nbsp; # "License :: OSI Approved :: MIT License",&nbsp; &nbsp; ],&nbsp; &nbsp; install_requires=[],)通过此示例,您现在可以运行以安装 mymodule,然后使用 运行所有测试。这不仅可以测试您的测试,还可以检查您的软件包是否正确安装/可安装。使用虚拟环境时,将安装在此处而不是整个系统。最后,您可以在所有文件中使用相对导入,因为您将拥有一个顶级模块“mymodule”,并且您的错误将消失。python setup.py installpytest testssetup.pyPS:如果您不喜欢导入,可以在目录中写入文件,以便能够做到甚至script1.script1__init__.pyfrom mymodule import script1from mymodule import ClassFromScript1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python