在 Heroku 但不是在本地出现错误“ImportError: No module named”
Posted
技术标签:
【中文标题】在 Heroku 但不是在本地出现错误“ImportError: No module named”【英文标题】:Getting error "ImportError: No module named" on Heroku but not locally 【发布时间】:2017-05-15 17:44:45 【问题描述】:当我尝试将我的应用程序部署到 heroku 但应用程序在本地构建良好时,我收到了ImportError: No module named
。这是 Heroku 的日志
Traceback (most recent call last):
File "mr_meeseeks.py", line 4, in <module>
import Helpers.Plugin_Handler as Plugin_Handler
File "/app/Helpers/Plugin_Handler.py", line 5, in <module>
from Utils.constants import Plugin_Type
ImportError: No module named 'Utils.constants'
这是我的文件结构:
据我所知,Utils/constants.py 存在。如果它是相关的,这是一个 SlackBot。其余代码可以在here找到。
【问题讨论】:
我很惊讶它没有在本地抛出错误,Utils 与 Helpers 不在同一个模块中。您能否在本地删除所有__pycache__
并重试?另外你怎么知道它没有在本地失败?您是否尝试过产品步骤,或者您是根据您的测试这么说的。说到你的测试没有签入:)
@plumSemPy 遗憾的是,我还没有任何测试。我知道它不会在本地失败,因为我可以运行 python mr_meeseeks.py
并且它不会像在 Heroku 上那样崩溃。 Slackbot 还将按预期响应消息。我的 Procfile 的内容是worker: python mr_meeseeks.py
,所以就我所知,这两者应该是等价的。我删除了__pycache__
文件,但它仍然没有在本地崩溃。你问的是这个吗?
是的,Plugin_Handler
中的导入不应该起作用,因为 Utils 与 Plugin_Handler
不在同一个模块(目录)中,这让我觉得有些东西被缓存了。能否请您尝试删除所有.pyc
文件?我正在尝试在本地重现您的产品错误
是的。删除 .pyc 文件并在本地重新运行。仍然工作正常。
见下面@noɥʇʎԀʎzɐɹƆ的回答。此外,您的 github 中有一个 utils
,其中包含 constants
,然后是一个没有任何内容的 Utils
。两个文件夹。
【参考方案1】:
Python 解释器在 $PYTHONPATH
环境变量下查找模块。看起来您或您的编辑器(当我将目录标记为源时,我的编辑器会这样做)root 已将 SlackBot/
添加到 $PYTHONPATH
。
当我将目录标记为源根目录时,我自己也遇到了这个错误。
你有几个选择:
使机器人启动脚本将SlackBot/
附加到$PYTHONPATH
使用相对导入 - from ..Utils import constants
Dynamically add SlackBot/
to the sys.path
variable
另外,关于风格的说明:python 类应该是CamelCase
,python 模块应该是lowercase_with_underscores
。如果你有像 PyCharm 这样的编辑器,你的编辑器可以自动修复这些问题,等等。
PEP 8 是官方的 Python 风格指南,尽管我建议使用 linter,以便自动检测和修复这些问题。
【讨论】:
here 给出的解决方案能解决我的问题吗? @TWOF 是的,它也附加到 PYTHONPATH。 (别忘了投赞成票!:))【参考方案2】:在您的 Procfile 中,将 Slackbot 附加到 PYTHONPATH,尝试添加
--pythonpath SlackBot
作为论据。这个link 也解决了完全相同的问题。
【讨论】:
以上是关于在 Heroku 但不是在本地出现错误“ImportError: No module named”的主要内容,如果未能解决你的问题,请参考以下文章
isBlank() 在本地工作,但是在推送到 heroku 时:找不到符号
Knex 与 Heroku Postgres 连接出现错误?