【问题标题】:How do i import files that mutually import each other?如何导入相互导入的文件?
【发布时间】:2017-11-16 05:30:48
【问题描述】:

如何导入相互导入的函数和字典。这两个文件已经在同一个目录中,因此没有 nid 来导入 sys.另外,我这是递归的,这就是它无法导入的原因。如何从彼此的文件中导入字典而不使其递归并导致错误?

我确实去了这个网站here,但它没有回答我的问题,也没有提供任何示例代码来指导我,因此我用测试代码创建了这个问题来解释我的问题。

假设我有这两个文件:boxA 和 boxR,每个文件都有一个字典 keyA 和 keyR 以及名为 generatekeyA 和 generatekeyR 的函数

在盒子A中:

import json 
from tinydb import TinyDB, Query
from boxR import keyR

def generatekeyA():

    keyA = {}

    serialnoA = 'Serial_noA'
    secretidA = 'Secret_idA'

    count = 0
    while (count <5): 

    serial = generate key 
    id = generate id 


    keyA[serialnoA].append(serial)
    keyA[secretidA].append(id)


    with open("/home/pi/Desktop/json/output.json", 'w+'):
        db = TinyDB('/home/pi/Desktop/json/output1.json')
        table = db.table('A KEYS')
        db.insert_multiple([{'Serial number A' :  keyA[serialnoA]}])
        db.insert_multiple([{'Secret id A' : keyA[secretidA]}])
        db.insert_multiple([{'Secret id R' : keyR[secretidR]}])

generatekeyA()

在盒子里:

import json 
from tinydb import TinyDB, Query
from boxA import keyA

def generatekeyR():

    keyR = {}

    serialnoR = 'Serial_noR'
    secretidR = 'Secret_idR'

    count = 0
    while (count <5): 

    serialR = generate key 
    idR = generate id 


    keyR[serialnoR].append(serialR)
    keyR[secretidR].append(idR)


    with open("/home/pi/Desktop/json/output2.json", 'w+'):
        db = TinyDB('/home/pi/Desktop/json/output2.json')
        table = db.table('R KEYS')
        db.insert_multiple([{'Serial number R' :  keyR[serialnoR]}])
        db.insert_multiple([{'Secret id R' : keyR[secretidR]}])
        db.insert_multiple([{'Secret id A' : keyA[secretidA]}])


generatekeyA()

让我解释一下上面的代码。我有 2 个为我生成密钥的文件,之后,我必须将输出导出到 json 文件中。 output.json 文件将 keyA 自己的序列号和密钥 id 以及只有 keyR 的 secretid 和反之亦然打印到 output2.json 文件中。但问题是,尽管我研究了递归输出,但我仍然不明白如何修复它,因为它没有提供任何示例代码作为指导。解决此问题的最佳方法是什么,我不必对文件进行太多更改?

错误告诉我可能是递归错误:

Traceback (most recent call last):
File "/home/pi/Desktop/boxA.py", line 7, in <module>
from boxR import keyR
File "/home/pi/Desktop/boxR.py", line 11, in <module>
from boxA import keyA
File "/home/pi/Desktop/boxA.py", line 7, in <module>
from boxR import keyR
ImportError: cannot import name 'keyA'

【问题讨论】:

  • 我不确定这是否可能,因为正在发生递归。 Python 假设你需要keyR 来运行boxA 并且你需要keyA 来运行boxR,两者都不能满足另一个。看起来(从这个 sn-p)你并不特别需要这些变量?
  • @Jérôme 不,上面的链接没有提供示例代码和示例答案供我理解。
  • @ISOmetric 但是,我需要运行 keyA 中的代码,同时打印出 key R 的输出,反之亦然。解决这个问题的最佳方法是什么?
  • 我有点不确定您的缩进 - 是 generatekeyA/R() 函数的所有内容部分还是您定义了一个空函数?因为我认为它无论如何都行不通,就这样布置。

标签: python python-3.x dictionary recursion tinydb


【解决方案1】:

这是一个循环依赖。我不确定如何在不更改模块的基本结构以及依赖关系图的情况下解决它。您为什么不尝试在单独的文件中定义两个字典并导入它们。因为它看起来像你的代码,所以它们无论如何都是空的。

您可能会发现this 的文章很有趣。本质上,当您执行递归依赖时,导入的模块在执行导入语句时会发现彼此为空模块。因此出现了这个错误

【讨论】:

  • 网站似乎已关闭。 here 是另一个可能有用的例子
【解决方案2】:

在盒子A中:

def generatekeyA():
  from boxR import keyR
  do whatever you need to with keyR

keyA = {}

在盒子里:

def generatekeyR():
  from boxA import keyA
  do whatever you need to with keyA

keyR = {}

更新

如果您仍然看到问题,您可能还没有从 boxA 的全局范围中删除 keyR 的导入以及从 boxR 的全局范围中删除 keyA 的导入。例如,这按预期工作:

################# The file, boxR.py
def generatekeyR():
  from boxA import keyA
  print 'In generatekeyR'

keyR = {}

################# The file, boxA.py
def generatekeyA():
  from boxR import keyR
  print 'In generatekeyA'

keyA = {}

################# The file, box.py
#!/usr/bin/env python
import boxR
import boxA
from boxR import generatekeyR
from boxA import generatekeyA

generatekeyR()
generatekeyA()

从 bash 提示符:

> ./box.py
In generatekeyR
In generatekeyA

【讨论】:

  • 嗨!我尝试按照您上面的建议进行操作,但没有成功。两个文件都无法导入彼此的字典
【解决方案3】:

我仍在努力找出您的代码的确切形状,这在 Python 中是至关重要的。将来,更彻底地阅读您的问题并确保格式正确会很有帮助。

基于我所做的一些假设(最重要的是,添加到数据库的with 语句发生在while 循环之外)这是我想出的。总之,这些变化是:

  1. 将密钥生成函数更改为return 它们生成的密钥。

  2. 创建了一个新的 Python 文件(称为 new.py,但您可以随意调用它)来处理数据库的更新。

  3. 在执行需要两个键的with 语句之前,将生成函数导入new.py 并在那里调用它们。

这是我最终得到的代码。希望对您有所帮助。

boxA.py

def generatekeyA():

    keyA = {}

    serialnoA = 'Serial_noA'
    secretidA = 'Secret_idA'

    count = 0
    while (count <5): 

        serial = generate key 
        id = generate id 

        keyA[serialnoA].append(serial)
        keyA[secretidA].append(id)

        # Also need to update count

    return keyA

boxR.py

def generatekeyR():

    keyR = {}

    serialnoR = 'Serial_noR'
    secretidR = 'Secret_idR'

    count = 0
    while (count <5): 

        serialR = generate key 
        idR = generate id

        keyR[serialnoR].append(serialR)
        keyR[secretidR].append(idR)

        # Also need to update count

    return keyR

new.py

import json 
from tinydb import TinyDB, Query
from boxA import generatekeyA()
from boxR import generatekeyR()

keyA = generatekeyA()
keyR = generatekeyR()

with open("/home/pi/Desktop/json/output2.json", 'w+'):
    db = TinyDB('/home/pi/Desktop/json/output2.json')
    table = db.table('R KEYS')
    db.insert_multiple([{'Serial number R' :  keyR[serialnoR]}])
    db.insert_multiple([{'Secret id R' : keyR[secretidR]}])
    db.insert_multiple([{'Secret id A' : keyA[secretidA]}])

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 2015-05-24
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多