Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何导入相互导入的文件?_Python_Python 3.x_Dictionary_Recursion_Tinydb - Fatal编程技术网

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

Python 如何导入相互导入的文件?,python,python-3.x,dictionary,recursion,tinydb,Python,Python 3.x,Dictionary,Recursion,Tinydb,如何导入相互导入的函数和字典。这两个文件已经在同一个目录中,因此没有要导入sys的nid。此外,我认为它是递归的,这就是它无法导入的原因。如何从彼此的文件导入词典而不使其递归并导致错误 我确实去了这个网站,但它没有回答我的问题,也没有提供任何示例代码来指导我。因此,我用测试代码创建了这个问题来解释我的问题 假设我有两个文件:boxA和boxR,每个文件都有一个字典keyA和keyR以及名为generatekeyA和generatekeyR的函数 在boxA中: import json from

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

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

假设我有两个文件: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()
def generatekeyA():
  from boxR import keyR
  do whatever you need to with keyR

keyA = {}
导入json
从tinydb导入tinydb,查询
从boxR导入键
def generatekeyA():
keyA={}
serialnoA='Serial_noA'
secretidA=‘Secret_idA’
计数=0

while(count这是一个循环依赖项。我不知道如何在不改变模块的基本结构和依赖关系图的情况下解决它。为什么不尝试在一个单独的文件中定义这两个dict并导入它们。从代码看,它们都是空的dict

您可能会发现这篇文章很有趣。本质上,当您执行递归依赖时,导入的模块在执行导入语句时会发现彼此都是空模块。因此,此错误显示在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()
def generatekeyA():
  from boxR import keyR
  do whatever you need to with keyR

keyA = {}
在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()
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
循环之外),我得出了以下结论。总之,更改如下:

  • 将密钥生成函数更改为
    返回它们生成的密钥

  • 创建了一个新的Python文件(名为
    new.py
    ,但您可以随意调用),用于处理数据库的更新

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

    我不确定这是否可能,因为正在发生的递归。Python假设您需要
    keyR
    来运行
    boxA
    ,您需要
    keyA
    来运行
    boxR
    ,两者都不能满足对方。看起来像(从这段代码)你并不特别需要这些变量吗?可能是@Jérôme的副本否,上面的链接没有提供示例代码和示例答案供我理解。@ISOmetric但是,我需要在keyA中运行代码,同时从Keyr打印输出,反之亦然。实现这一点的最佳方法是什么?我有点担心le不确定缩进-是否所有内容都是
    generatekeyA/R()
    函数的一部分,或者您定义了一个空函数?因为我认为它无论如何都不会工作,就像那样。嗨!我尝试了执行您上面建议的操作,但没有工作。两个文件无法相互导入词典