【问题标题】:ImportError when use pycharm profile使用 pycharm 配置文件时的 ImportError
【发布时间】:2020-05-26 01:07:04
【问题描述】:

问题

我启动了一个烧瓶应用程序,当我使用“运行”或“调试”时它运行良好。但是,使用“配置文件”时出现错误,这是日志消息

In folder C:/Users/Myname/PycharmProjects/ProjectName
"C:\Users\Myname\Anaconda3\envs\ProjectName\python.exe" "C:\Program Files\JetBrains\PyCharm 
Professional Edition with Anaconda plugin 2019.2.4\helpers\profiler\run_profiler.py" 127.0.0.1 12055 -m flask run
Starting cProfile profiler
Traceback (most recent call last):
Snapshot saved to C:\Users\Myname/.PyCharm2019.2/system\snapshots\ProjectName1.pstat
File "C:\Program Files\JetBrains\PyCharm Professional Edition with Anaconda plugin 2019.2.4\helpers\profiler\run_profiler.py", line 173, in <module>
profiler.run(file)
File "C:\Program Files\JetBrains\PyCharm Professional Edition with Anaconda plugin 2019.2.4\helpers\profiler\run_profiler.py", line 89, in run
execfile(file, globals, globals)  # execute the script
File "C:\Program Files\JetBrains\PyCharm Professional Edition with Anaconda plugin 2019.2.4\helpers\profiler\prof_util.py", line 30, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "C:\Users\Myname\Anaconda3\envs\ProjectName\lib\site-packages\flask\__init__.py", line 19, in <module>
from . import json
ImportError: attempted relative import with no known parent package

我的尝试

我google了一下,发现是老问题了。

Can't profile module using relative imports

Pycharm profile is not working

如何重现它

如果你想复现它,你可以使用pycharm创建一个flask app,然后点击“profile”。

flask app 的默认代码如下。但我认为这并不重要。

from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

由于flask版本或Pycharm版本的变化,错误信息可能会有所不同,但原因是一样的:File "xxx\lib\site-packages\flask\__init__.py", line 19, in &lt;module&gt;使用相对导入导致ImportError

我的问题

我的问题是,有没有办法让它工作?任何黑客或技巧也值得赞赏。我现在只想使用配置文件。谢谢

【问题讨论】:

    标签: python flask pycharm


    【解决方案1】:

    显然,这是 PyCharm 的分析器长期存在的问题,它无法正确运行 packages 导致 sys.path 不稳定并且相对导入失败:https://youtrack.jetbrains.com/issue/PY-28509

    我想一个选项是制作您自己的“启动器脚本”,只需复制what flask.__main__ does

    虽然可能如果你运行 -m flask.cli 而不是仅仅运行 -m flask(我不知道,我没有测试它)也能解决问题:它做同样的事情但确实不要调用 __main__ 文件,这样它的行为会更好。

    【讨论】:

    • 是的,使用 -m flask.cli 可以解决问题。我更新了答案以显示如何在 pycharm 中配置它
    【解决方案2】:

    [新解决方案]

    感谢@Masklinn,使用-m flask.cli 插入-m flask 可以解决这个问题。但是,pycharm flask 中的配置默认使用-m flask,我找不到修改它的方法。因此,我建议使用pycharm pythonscript path 应设置为您的FLASK_APP,并在addtional options 中添加-m flask.cli

    [过时的解决方案]

    一种解决方案是直接修改__init__.py 使其工作。例如,改变

    from . import json
    from .app import Flask
    

    from flask import json
    from flask.app import Flask
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-02
      • 2020-12-28
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多