gpt4 book ai didi

python - 这种导入如何被视为循环(或者为什么我会收到 "ImportError: cannot import name EmailMessage"错误)

转载 作者:行者123 更新时间:2023-12-01 09:18:13 29 4
gpt4 key购买 nike

更新:
错误(在本例中)不是由循环导入引起的,而是由 virtualenv 中的缺陷引起的。配置。请参阅my answer下面,进行详细说明。

<小时/>

我正在使用:

我正在使用 Flask 构建一个 Web 应用程序,除其他外,我需要能够向用户发送邮件。我构建了一个单独的 Python 模块,它将负责邮件处理。尽管在我将电子邮件处理模块添加到我的应用程序后,我遇到了一个奇怪的(至少在我看来)import 问题。

<小时/>

这是我遇到的(隔离的)导入问题:

app.py

from flask import Flask
from test_mail import EmailTool

app = Flask(__name__)

@app.route('/')
def index():
return 'Testing!'

test_mail.py

from email.message import EmailMessage

class EmailTool(object):
pass

启动我的应用程序并转到索引(即 /)后,我收到:

Traceback (most recent call last):
File "/app.py", line 2, in <module>
from tmp_test_mail import EmailTool
File "/test_mail.py", line 1, in <module>
from email.message import EmailMessage
ImportError: cannot import name EmailMessage
<小时/>

我更改了 test_mail.py 的代码,以确保 email 模块可访问:

import email

class EmailTool(object):
pass

这样我就不会收到错误。

搜索可能的原因和解决方案使我相信( 12345 ),它很可能与循环引用有关。尽管即使在阅读了所有提到的 Material 并隔离了问题原因之后,我仍然看不出它是如何循环引用的。所以我的结论是,要么它不是循环的,原因在于其他东西,要么它是循环的,但我在这里遗漏了一些明显的东西。

<小时/>

我请求帮助理解以下内容:

  1. 上述案例是否被视为循环引用? (如果是,它实际上是如何圆形)?
  2. 为什么我在执行 from email.message import EmailMessage 时会收到错误消息,但如果执行 import email 则不会收到错误消息?

最佳答案

TL;DR:实际问题与循环依赖无关 - 结果是我的虚拟环境配置错误(Python 版本实际上是 2.7.10 ,正如 hjpotter92 的评论中所建议的那样)。

<小时/>

我是如何发现这是原因的(作为调试 Python venv 的食谱集合发布,这可能以后对我自己有用,希望对其他人也有用):

  1. 在阅读了我的问题的评论(特别是 hjpotter92 的评论)后,我赶紧检查 virtualenv 中的 Python 版本我运行我的应用程序(即使我在发布问题之前已经检查过它 - 在这种事情上你不能太小心=)。

    运行(在虚拟环境内):

    python --version

    给了我(正如我所期望的那样):

    Python 3.6.1
  2. 不过我并不相信 =)。正如这个答案所建议的:12 ,我已将以下内容添加到两个模块的代码中: app.pytest_mail.py (为了检查它们实际运行的Python版本):

    import sys
    ...
    print(sys.version)

    它正在输出(对我来说令人惊讶):

    2.7.10
  3. 好吧,显然这里出了问题。我决定复习一下virtualenv的基础知识设置。 first article我偶然发现,建议pip --version作为设置过程的第二步(在 python --version 之后)。由于没有什么可丢失的,我运行了它(当然是在虚拟环境中),并且(令我惊讶的是)它给了我:

    pip 9.0.1 from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (python 2.7)

    所以,不知何故 pip 在虚拟环境中使用的是系统级...

  4. 此时,我怀疑我的应用程序是从 virtualenv 运行的。根本不。遵循 this answer 中的食谱(并评论),我已撰写并添加到 app.pytest_mail.py ,以下代码片段:

    import sys

    ...

    if hasattr(sys, 'real_prefix'):
    print('Python 2 venv')
    elif (hasattr(sys, 'base_prefix') and sys.prefix != sys.base_prefix):
    print('Python 3 venv')
    else:
    print('Not venv!')

    (此时)它正在打印 Not venv! 并不令人意外。 .

  5. 调试当前虚拟环境到底出了什么问题似乎非常耗时。所以,我最终做了什么:
    • 正在删除 Flask以及系统级别的相关软件包( itsdangerousJinja2MarkupSafeWerkzeug )(由于某种原因安装在那里)通过 pip uninstall <package_name> .
    • 使用 python3 -m venv <env_name> 重新创建虚拟环境
<小时/>

现在,回答我自己的问题:

  1. 我的问题中的代码不包含循环引用。
  2. 尝试执行 from email.message import EmailMessage 后出现错误,发生的原因是实际使用了 Python 2.7.10,如果我们查看 source code of message.py 对于这个版本的 Python,我们将看到它根本不包含名为 EmailMessage 的类。 。而source code of message.py for Python 3.6.* library ,确实包含名为 EmailMessage 的类.

关于python - 这种导入如何被视为循环(或者为什么我会收到 "ImportError: cannot import name EmailMessage"错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51039756/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com