首页 > 解决方案 > Python ModuleNotFoundError 'smored' 即使文件夹 smored 有 __init__.py

问题描述

我有一个团队开发的 Python 应用程序,如果我运行“docker-compose up”然后运行单元测试,它们工作得很好。所以那部分很棒。

但我负责确保在 Jenkins 中构建我们的应用程序和构建 Docker 映像。在 Jenkins 中,我使用“docker build”命令,然后使用“docker run”命令,并将 CMD 设置为我们的脚本“runtests.py”。显然,我们需要在 Jenkins 中自动运行测试。当我这样做时,我得到了这个错误:

ModuleNotFoundError: No module named 'smored'

所以我在我们的 runtests.py 脚本中添加了一些调试信息:

print(" os.path.dirname(os.path.realpath(__file__)) " + os.path.dirname(os.path.realpath(__file__))) 
print(" os.getcwd() " + os.getcwd()) 

try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
    print(" PYTHONPATH " + user_paths)
except KeyError:
    print(" There was a KeyError when we tried os.environ['PYTHONPATH'].split(os.pathsep) ")

list_dir = os.listdir(".") # returns list
print("contents of cwd directory")
for item in list_dir:
    print(item)

try:
    list_dir = os.listdir("smored") # returns list
    print("contents of smored directory")
    for item in list_dir:
        print(item)
except:
    print("In the current working directory, we could not find a path called 'smored'")

看起来脚本在正确的目录中执行,在这个目录中有一个名为“smored”的文件夹,其中有一个名为init .py 的空文件。所以应该有一个名为“smored”的模块,这个错误不应该发生。

runtests.py 中接下来的两行是:

os.environ['DJANGO_SETTINGS_MODULE'] = 'smored.settings.test'
django.setup()

当我们调用 django.setup 时,脚本在下一行终止。

为什么这段代码会给出这个错误:

ModuleNotFoundError: No module named 'smored'

标签: pythonmodule

解决方案


这一行:

print(" os.getcwd() " + os.getcwd()) 

表明当 Docker 运行时,CWD 是/app.

我将settings文件夹添加到sys.path

sys.path.append("/app/")
sys.path.append("/app/smored/")
sys.path.append("/app/smored/settings/")

然后我能够简化DJANGO_SETTINGS_MODULE

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.test'
django.setup()

然后事情终于奏效了。

希望这可以节省一些时间,这让我感到头疼。


推荐阅读