我有一个由团队开发的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'
答案 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()
然后事情终于成功了。
希望这可以使我省下数小时的头痛。