如何配置python3 venv,使相对导入在Jenkins freestyle项目中正常工作?
我有一份Jenkins的工作,从Jenkins项目工作区内的不同Gitlab存储库中提取python文件。其中一些脚本应该由其他脚本导入,但我在使用相对导入时遇到了错误 ValueError:尝试在顶级包之外进行相对导入 script1.py如何配置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
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