2

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

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

假设我有这两个文件: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()

在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 的 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'
4

3 回答 3

1

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

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

于 2017-06-14T07:46:54.187 回答
0

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

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

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

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

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

这是我最终得到的代码。希望能帮助到你。

盒子A.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

盒子R.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

新的.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]}])
于 2017-06-15T08:04:03.133 回答
0

在方框 A 中:

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
于 2017-06-14T08:26:18.660 回答