0

我正在使用 django api 制作一个网站。问题是我收到一个奇怪的导入错误。我在一个文件中有一个函数,它调用另一个文件中的另一个函数,该函数又调用第一个文件中的第三个函数。

问题在于第三个功能。当我尝试导入它时出现错误

cannot import deletefromS3.

下面给出了完整的堆栈跟踪

http://dpaste.com/1288190/

以下是两个模块的片段:

主题处理程序.py:

from sdbhandler.mediahandler import deleteMediaParent
def deletefromS3(itemid,folder):
itemid=folder+itemid
bucket = connect_s3()
for key in bucket:
    fname=key.split(".")[0]
    if(fname==itemid):
        bucket.delete_key(key)
        return []


def deleteTopic(itemid,parentId='NULL'):
    sdb=connect()
    domain= sdb.get_domain(DOMAIN)
    rootitem = domain.get_item(itemid)
    if(parentId=='NULL'):
          query= 'select * from ' + DOMAIN + ' where itemName()="'+itemid+'"'
          rs = domain.select(query)
    else:
          rs = [rootitem]
    for  item in rs:
          deleteMediaParent(item.name)
          deletefromS3(item.name,'topicsK2/')
          domain.delete_attributes(item.name)
    deleteMediaParent(rootitem.name)
    deletefromS3(rootitem.name,'topicsK2/')
    domain.delete_attributes(rootitem.name)

媒体处理程序.py:

from sdbhandler.topichandler import deletefromS3
def deleteMediaParent(parentid):
sdb=connect()
domain = sdb.get_domain(DOMAIN)
query = 'select * from '+ DOMAIN + 'where ' +FIELD_TopicID + ' = "' + parentid + '"'
rs = domain.select(query)
for item in rs:
    deleteQuestionParent(item.name)
    deletefromS3(item.name,'mediaK2/')
    domain.delete_attributes(item.name)

有更多的依赖项,但我不能发布我的整个代码,这会太多了。我不能从调用方法的文件中导入吗?

4

1 回答 1

2

导入是不可能的,因为模块必须先完成加载,然后才能从中导入内容。当topichandler模块加载时,它会尝试deleteMediaParentmediahandler. 但是mediahandler尝试从 导入deletefromS3topichandler这会触发另一个加载尝试topichandler。Python 捕获即将发生的无限循环并引发错误。

让我们用一个更简单的例子来看看这个。这里是foo.py

#!/usr/bin/env python2.7

x = 3

from bar import y

print x, y

这是bar.py

from foo import x

y = x

出于同样的原因,这给出了同样的错误。

尽管最好的解决方案可能是将代码重组为更连贯的独立模块,但有一种解决方法。您可以通过将导入移到函数中来延迟导入,如下所示:

#!/usr/bin/env python2.7

x = 3

from bar import y

print x, y()

bar.py

def y():
    from foo import x
    return x

请注意,如果您运行此程序,print实际上将被导入两次……同样,您最好将相关功能移动到同一个模块中。

于 2013-07-04T20:22:58.287 回答