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



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

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

假设我有两个文件:boxA 和 boxR,每个文件都有一个字典键 A 和键,以及名为 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()

在盒子R中:

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 和 viceversa 打印到 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'

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

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

在 box A 中:

def generatekeyA():
from boxR import keyR
do whatever you need to with keyR
keyA = {}

在盒子R中:

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

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

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

  1. 更改了密钥生成函数以return它们生成的密钥。

  2. 创建了一个新的 Python 文件(称为new.py,但您可以随心所欲地称呼它),它处理数据库的更新。

  3. 将生成函数导入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]}])

最新更新