python - 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'
解决方案
这一行:
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()
然后事情终于奏效了。
希望这可以节省一些时间,这让我感到头疼。
推荐阅读
- html - 为什么 XHTML 标记在 HTML5 文档中起作用,反之亦然?
- javascript - 使用 Javascript 禁用粘贴操作(不包括 Jquery)
- reactjs - 如何将 Autodesk Forge 查看器扩展添加到 React?
- javascript - 在 html 页面上对具有大量内容的 div 进行排序的最佳方法?
- error-handling - 如何处理 PayPal 智能按钮中的错误?
- ruby - 如何从ruby中的方法中删除多个返回?
- asp.net-core - 在 Core3.1 中安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 时,项目必须提供配置错误的值
- node.js - 在 multer 的 diskStorage 函数中获取 `req.params`
- java - Spring Boot 事务 id
- python - 让 Python Pandas 更快