如何导入相互导入的文件?

时间:2017-06-14 07:37:21

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

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

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

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

在boxA中:

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()

在boxR中:

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&#39; s的秘密,反之亦然,输出到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'

3 个答案:

答案 0 :(得分:1)

这是循环依赖。我不知道如何在不改变模块的基本结构的情况下解决问题,因此也就是依赖图。为什么不尝试在单独的文件中定义这两个词组并导入它们。因为看起来形成你的代码,无论如何它们都是空的。

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

答案 1 :(得分:0)

在boxA中:

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

keyA = {}

在boxR中:

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

答案 2 :(得分:0)

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

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

  1. 将密钥生成功能更改为return它们生成的密钥。

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

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

  4. 这是我最终得到的代码。希望它有所帮助。

    <强> 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]}])