Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何配置python3 venv,使相对导入在Jenkins freestyle项目中正常工作?_Python_Jenkins - Fatal编程技术网

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

如何配置python3 venv,使相对导入在Jenkins freestyle项目中正常工作?,python,jenkins,Python,Jenkins,我有一份Jenkins的工作,从Jenkins项目工作区内的不同Gitlab存储库中提取python文件。其中一些脚本应该由其他脚本导入,但我在使用相对导入时遇到了错误 ValueError:尝试在顶级包之外进行相对导入 script1.py from ..script2/script2 import foo def foo(): print('Foo!') /var/lib/jenkins/workspace/project_name script1/ sc

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

ValueError:尝试在顶级包之外进行相对导入

script1.py

from ..script2/script2 import foo
def foo():
    print('Foo!')
/var/lib/jenkins/workspace/project_name
    script1/
        script1.py
    script2/
        # script2.py contains 'foo' function
        script2.py
script2.py

from ..script2/script2 import foo
def foo():
    print('Foo!')
/var/lib/jenkins/workspace/project_name
    script1/
        script1.py
    script2/
        # script2.py contains 'foo' function
        script2.py
文件/目录层次结构

from ..script2/script2 import foo
def foo():
    print('Foo!')
/var/lib/jenkins/workspace/project_name
    script1/
        script1.py
    script2/
        # script2.py contains 'foo' function
        script2.py
Jenkins'Execute shell'构建步骤

#!/bin/bash

python3 -m venv ${WORKSPACE}/venv
. ${WORKSPACE}/venv/bin/activate

python ${WORKSPACE}/script1/script1.py 

我错过了什么?

理想情况下,测试应该在“干净的环境”中进行。 因此,与使用相对导入运行脚本测试不同,一种解决方案是编写
setup.py
,将项目作为模块本地安装。 然后,您可以编写单独的测试,从mymodule import script1.script1中执行

如果你走这条路,你需要决定一个项目结构。没有最好的结构(参见)。作为一个例子,这里是我的典型结构:

├── src/
│   ├── script1/
│   │   └── script1.py
│   └── script2/
│       └── script2.py
├── tests/
│   ├── test_script1.py
│   └── test_script2.py
└── venv/
还有一个setup.py,如下所示:

import os

from setuptools import find_packages, setup

# load desc from readme
def read(fname):
    return open(os.path.join(os.path.dirname(__file__), fname)).read()

setup(
    name="mymodule",
    version="0.0.1",
    author="you",
    author_email="<you@you.com>",
    description=("short description"),
    license="<none>",
    packages=find_packages("src"),
    package_dir={"": "src"},
    long_description=read("README.md"),
    classifiers=[
        "Development Status :: 2 - Pre-Alpha",
        "Topic :: Utilities",
        # "License :: OSI Approved :: MIT License",
    ],
    install_requires=[],
)
导入操作系统
从setuptools导入查找包,安装
#从自述文件加载描述
def读取(fname):
返回open(os.path.join(os.path.dirname(_文件,fname)).read()
设置(
name=“mymodule”,
version=“0.0.1”,
author=“你”,
作者_email=“”,
描述=(“简短描述”),
许可证=”,
packages=find_packages(“src”),
包_dir={“”:“src”},
long_description=read(“README.md”),
分类器=[
“发展状况:2-阿尔法之前”,
“主题::实用程序”,
#“许可证::OSI已批准::MIT许可证”,
],
安装_需要=[],
)
在本例中,您现在可以运行
python setup.py install
来安装mymodule,然后使用
pytest tests
运行所有测试。 这不仅测试您的测试,还检查您的包是否正确安装/可安装。 使用虚拟环境时,将在此处安装
setup.py
,而不是安装整个系统。
最后,您可以在所有文件中使用相对导入,因为您将有一个顶级模块“mymodule”,并且您的错误将消失


PS:如果你不喜欢导入
script1.script1
,你可以在目录中编写
\uuuu init\uuuuu.py
文件,这样就可以从mymodule导入script1
或者甚至从mymodule导入类导入
从script1

在我的项目中,我要做的是定义一个setup.py安装包,然后编写单独的脚本现在可以导入脚本而不会出现问题的测试。(
来自mypackage import script1
)-如果这听起来很有趣,我可以写一个答案,其中包含指向我所访问的资源的链接used@clotodex:这看起来很有趣,你能把细节贴出来吗?谢谢。@napuzba:你的网站很有意思,可以了解进口的机械设备。如何在当前用例中应用这一点?出于显而易见的原因,我无法修改Jenkins project workspace目录,并且我的所有python文件都来自其自己(子)子目录中的git clone。不幸的是,如果不更改目录结构,我没有解决方案:-(您还应该将
从..script2/script2导入foo
更改为
从..script2.script2导入foo