【问题标题】:import python class into another folder in a package将python类导入包中的另一个文件夹
【发布时间】:2013-12-07 23:51:18
【问题描述】:

我正在尝试从我的 python 包的另一个文件夹中导入一个 python 类,但出现此错误“没有名为模型的模块”。

这是一个 Flask 项目。

-app
  |-run.py
  |-myapp
    |- libs
        |- updateto
            |- __init__.py      (empty)
            |- connection.py
        |- removeto
        |- __init__.py    (empty)
    |- static
    |- templates
    |- __init__.py      (NOT empty)
    |- routes.py
    |- models.py

我的 init.py:

from flask import Flask

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///maindb.db'

from models import db
db.init_app(app)

import myapp.routes

在我的 models.py 中有一个名为:application 的类

在 connection.py 中,我想导入我的类“应用程序”。 我尝试使用“从模型导入应用程序”,但出现此错误“没有名为模型的模块”。

我认为通过修改“updateto”文件夹中的 init.py 可以达到这个目标,但我不确定,因为我不清楚 init 的功能.py 文件...

谢谢

编辑:

这很奇怪,如果在connection.py下我添加“import myapp”和“print(help(myapp))”,我有这个输出:

Help on package myapp:

NAME
    myapp

FILE
    c:\app\myapp\__init__.py

PACKAGE CONTENTS
    libs (package)
    models
    routes

DATA
    app = <Flask 'myapp'>

但是,如果我尝试“从 myapp 导入模型”,则会出现此错误“ImportError:无法导入名称模型”

EDIT2:

如果我尝试在 connection.py 中添加“从 myapp 导入应用程序”,它会起作用,但如果我尝试导入模型则不会……我很惊讶。我尝试添加 myapp/init.py:

__all__ = ["models", "routes]

但同样的错误...

EDIT3:

嗯,我已经将 libs 文件夹下的所有模块移动到 myapp 中,当我尝试将 connection.py “从模型导入应用程序”放入时,我总是出现同样的错误“ImportError:无法导入名称应用程序”

connection.py中的其他测试:

import models
print(models)

Output:
<module 'myapp.models' from 'C:\app\myapp\models.pyc'>

我可以导入名为 models 的模块,但无法导入 models.py 下的类

EDIT4:

好的,我想我找到了问题所在。它是我在 myapp 中的 ini.py,因为如果我评论这个文件内容,connection.py 现在可以在模型中导入我的类应用程序。我运行使用 routes.py 的文件 run.py 并且是他调用 operation.py

通过一些测试,我找到了导致我的错误的行:

from models import db
db.init_app(app)
import myapp.routes

但是为什么????

【问题讨论】:

  • 可能是导入路径的问题。您能告诉我们您是如何加载connection.py 文件的吗?你是从updateto 目录运行它吗?
  • No 在我的烧瓶应用程序中运行。这是我启动 run.py 时调用 connection.py 的 routes.py 文件。

标签: python import module flask


【解决方案1】:

我不具体了解 Flask,但在 Python 中,您通常应该在 每个 文件夹和子文件夹中包含一个 __init__.py,以便将它们识别为模块和/或包。

在您提供的图表中,app 文件夹中没有 __init__.py。如果可以解决您的问题,请尝试发布并重新发布。

如果不起作用,请尝试:

import os
print(os.getcwd())

如果当前工作目录不是app 目录,则必须解决此问题。一种方法是:

import sys
sys.path.append('/path/to/app')

import myapp.models

通过检查sys.path,您始终可以查看模块搜索路径中的目录。

更新:抱歉,我刚刚意识到您可能正在尝试将 connections.py 作为脚本运行。这会将您的工作目录更改为connections.py 的目录。尝试从主脚本中导入connections.py,在connections.py 中使用import models,看看是否有错误。


更新(回复编辑 4):(我还没有足够的声望点来发表评论,所以我在这里回复)

from models import db
db.init_app(app)
import myapp.routes

这段代码的问题是import myapp.routes。将其更改为import routes,它应该可以工作。根据经验,您的主脚本目录 是您的根目录。您可以使用简单的 import moduleany 其他模块(甚至是子文件夹中的模块!)中导入位于根目录中的 any 模块。

【讨论】:

  • 我尝试将 init.py 放在应用程序的根文件夹中,但同样的错误。我检查了 connection.py 中的 sys.path 值,我认为路径很好:“C:\\app\\myapp”。而且我没有将 connection.py 作为脚本执行,但他在我的烧瓶应用程序中被调用。是 routes.py 调用他。
  • 看看这个link
  • 我已经检查了这个链接。但是,如果我尝试在 connection.py "from ..libs import models" 中出现此错误 "ImportError: No module named libs"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 2020-01-24
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多