如何导入相互导入的函数和字典。这两个文件已经在同一个目录中,因此没有导入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'
答案 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
循环)这就是我所做的想出来。总之,这些变化是:
将密钥生成功能更改为return
它们生成的密钥。
创建了一个新的Python文件(称为new.py
,但您可以随意调用它)来处理数据库的更新。
在执行需要两个密钥的new.py
语句之前,将生成函数导入with
并在那里调用它们。
这是我最终得到的代码。希望它有所帮助。
<强> 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]}])