即使被存储的文件夹具有__init __。py,Python ModuleNotFoundError也被“存储”

时间:2018-06-24 13:42:18

标签: python module

我有一个由团队开发的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'

1 个答案:

答案 0 :(得分:1)

此行:

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()

然后事情终于成功了。

希望这可以使我省下数小时的头痛。