需要帮助理解模块导入错误

3

我正在试着将sendgrid的Python API作为web2py模块来使用。在命令行上成功测试后,我将其放到了我的模块文件夹中。但是当我尝试在控制器文件中导入sendgrid时,就会出现以下错误:

File "applications/test/modules/sendgrid/__init__.py", line 4, in
<module>
    del sendgrid, message NameError: name 'sendgrid' is not defined

查看 __init__.py 文件,我注意到他们在模块级别上进行了*导入,这可能会引起问题,我之前见过类似的问题,但我不确定问题出在哪里。

sendgrid/__init__.py:

from sendgrid import *
from message import *

del sendgrid, message

__version__ = "0.1.0"
version_info = (0, 1, 0)

SendGrid API: https://github.com/sendgrid/sendgrid-python

SendGrid API是一种用于发送电子邮件的工具,可以使用Python编程语言来实现。您可以访问上述链接以获取有关SendGrid API的更多信息和使用说明。

你能展示一些出现错误的工作代码吗? - jadkik94
在控制器文件的顶部添加 import sendgrid - 就这样 - Yarin
在那个文件中尝试一下这个:import sys; print sys.path; import sendgrid - Colin Dunklau
Colin- 我无法从web2py控制器文件中打印输出 - 你想让我做什么? - Yarin
他想看看你的 PYTHONPATH - jadkik94
显示剩余3条评论
1个回答

4
通常来说,安装第三方模块的最佳实践是通过pipeasy_install(最好在virtualenv中)进行安装,如果它们在PyPI上可用。而不是将它们复制到PYTHONPATH的某个位置。
如果没有pip,请尝试从您的模块文件夹中删除sendgrid包并执行pip install sendgrid-pythoneasy_install sendgrid-python

Shakefu-“第三方模块的最佳实践是通过pip或easy_install安装”,您能解释一下为什么这是首选吗? - Yarin
因为它实际上通过python setup.py install将软件包安装到您的PYTHONPATH,并运行安装脚本钩子以安装可执行脚本、构建C扩展等,这不仅仅是复制模块。另外,使用虚拟环境很好,因为它为每个项目提供了一个受控的软件包/依赖项环境,而不是在整个系统范围内安装每个软件包(这可能需要root权限)。有一些情况下您无法使用虚拟环境,但并不多见。 - shakefu
因为如果你复制/粘贴目录,可能会遇到一些问题,特别是因为“sengrid”将不再在PYTHONPATH中。你正在篡改PYTHONPATH - jadkik94
将此内容作为独立的问题发布(http://stackoverflow.com/q/10761521/165673)- 我需要理解这个。 - Yarin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接