在Python文件间进行导入时出现错误

3
我正在使用Python构建一个基本的解析器应用程序。它监视一个文件夹,并在文件被放置在那里时导入它们。我有一个MongoDB,我正在尝试将导入保存到其中。这几乎没有什么难度。问题出现在当我尝试包含我的类/ mongo文档文件之一时。我确定这是我不理解的简单语法问题。我已经安装了所有要求,并在虚拟环境中运行此应用程序。但这是我的第一个Python应用程序,所以很可能是我没有看到的东西。
我的文件结构是:
application.py
requirements.txt
__init__.py
-services
   parser.py
   __init__.py
-models
   hl7message.py
   __init__.py

这是application.py文件。
from mongoengine import connect
import os, os.path, time
from services import parser

db = connect('testdb')
dr = 'C:\\Imports\\Processed'

def processimports():
    while True:
        files = os.listdir(dr)
        print(str(len(files)) + ' files found')
        for f in files:
            msg = open(dr + '\\' + f).read().replace('\n', '\r')
            parser.parse_message(msg)

        print('waiting')
        time.sleep(10)

processimports()

requirements.txt

mongoengine
hl7

parser.py

import hl7
from models import hl7message

def parse_message(message):
    m = hl7.parse(str(message))
    h = hl7message()

hl7message.py

from utilities import common
from application import db
import mongoengine

class Hl7message(db.Document):
    message_type = db.StringField(db_field="m_typ")
    created = db.IntField(db_field="cr")
    message = db.StringField(db_field="m")

如果我在parser.py中不包括hl7message类,它就可以正常运行,但是一旦我包括它,我就会收到错误,所以我确定它与那个文件有关。 然而,错误消息并不是很有用。 我不知道我是否陷入了某种包含循环之类的问题。
抱歉,以下是堆栈跟踪信息。
Traceback (most recent call last):
  File "C:/OneDrive/Dev/3/Importer/application.py", line 3, in <module>
    from services import parser
  File "C:\OneDrive\Dev\3\Importer\services\parser.py", line 2, in <module>
    from models import hl7message
  File "C:\OneDrive\Dev\3\Importer\models\hl7message.py", line 2, in <module>
    from application import db
  File "C:\OneDrive\Dev\3\Importer\application.py", line 23, in <module>
    processimports()
  File "C:\OneDrive\Dev\3\Importer\application.py", line 17, in processimports
    parser.parse_message(msg)
AttributeError: module 'services.parser' has no attribute 'parse_message'

确切的错误文本是什么? - rassar
1
你有任何 __init__ 文件吗? - José Sánchez
抱歉,@rassar。我添加了堆栈跟踪。 - Jhorra
1
@JoséSánchez 是的,我已经放置了__init__文件。我只是没有在这里列出它们的文件树。 - Jhorra
@rassar 我已经尝试剥离几乎所有内容以解决问题。目前,如果我删除 hl7message 的导入,则可以正常运行。只有在包含该文件时才会出现故障。 - Jhorra
显示剩余2条评论
1个回答

2

这是一个循环导入的问题。Application.py导入了parser,parser又导入了h17,h17又导入了h17message,h17message又导入了application,在整个解析器模块的代码运行之前就运行了processimports。

我认为服务模块不应该导入application。你可以创建一个新的模块common.py,其中包含代码db = connect('testdb'),并在application.py和h17message中都从common导入db。


我会试一试。我有一种感觉,那可能就是它。 - Jhorra
看起来就是这样。将它移动到一个database.py文件中解决了那个错误。现在我得到了一个新的错误,但似乎与mongoengine有关。 - Jhorra

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