gpt4 book ai didi

python - unittest,在本地工作,但不在远程服务器上,没有名为 x.__main__ 的模块; 'x' 是一个包,不能直接执行

转载 作者:行者123 更新时间:2023-12-04 09:33:29 24 4
gpt4 key购买 nike

我正在为我的 Python 包开发 Jenkins CI/CD 管道。我的项目文件层次结构如下:

project/
- package_name
- file1.py
- file2.py
- etc...
- tests
- unit
- __main__.py
- __init__.py
- test1.py
- test2.py
所有单元测试(我正在使用 unittest )都使用单个命令运行 python -m tests.unit通过添加 __init__.py以下内容:
内容
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
__main__.py看起来像这样
内容
import unittest
import sys

sys.path.append('../..')

loader = unittest.TestLoader()
start_dir = '.'
suite = loader.discover(start_dir)
runner = unittest.TextTestRunner(verbosity=2).run(suite)
首先将路径改为 ./tests/unit .之后,将顶层目录添加到导入路径中,以便可以在测试中导入包。这可以在我的个人笔记本电脑 (Python 3.6.4) 上按预期工作(即,通过在项目目录顶部运行 python -m test.unit 来执行所有剩余操作)。
但是,当我在远程 Jenkins 服务器(Python 3.6.4 也是如此)上使用相同的技巧时,我收到以下错误:
no module named test.unit.__main__; 'test.unit' is a package and cannot be directly executed
我已经研究过这个问题,但建议的解决方案似乎都不适用于我的情况。
如何修改我的代码以在 unittest 中创建测试套件这将在本地和远程运行没有任何问题?
编辑
我尝试修改 PYTHONPATH变量,但没有成功

最佳答案

1. 为什么它不起作用?
1.1。关于 python -m__main__.py当你运行 python -m tests.unit ,python解释器将运行什么代码,是,按这个顺序

tests.__init__.py
tests.unit.__init__.py
tests.unit.__main__.py
1.2.重现错误
现在,如果您删除 __main__.py ,您将收到以下错误:
No module named tests.unit.__main__; 'tests.unit' is a package and cannot be directly executed
这与您收到的消息几乎相同。如果您有 sys.path包含名为 test 的文件夹的文件夹具有这样的结构(注意: test -文件夹不在 prular 中,并且没有 __main__.py!)
test
├── __init__.py
└── unit
└── __init__.py
并运行命令
python -m test.unit
python解释器尝试运行的内容,按此顺序是
test.__init__.py
test.unit.__init__.py
test.unit.__main__.py <-- missing!
由于 test.unit.__main__.py丢失,您将收到错误消息
No module named test.unit.__main__; 'test.unit' is a package and cannot be directly executed
这是您收到的错误消息。因此,您的错误消息的原因很可能是您的 sys.path 中的某个位置。目录 名为 test 的目录使用如上所示的结构,您正在尝试调用 python -m test.unit而不是 python -m tests.unit .
2.如何使它工作?
  • 删除您的 os.chdirsys.path.append您在 __init__.py 中使用的技巧和 __main__.py .至少,python unittest 工作不需要它们。
  • 使用 documentation 中显示的模式创建单元测试(通过继承unittest.TestCase)
  • 通过
  • 运行您的单元测试
    python -m unittest

    关于python - unittest,在本地工作,但不在远程服务器上,没有名为 x.__main__ 的模块; 'x' 是一个包,不能直接执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62707250/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com