从不同python文件交叉调用函数失败
当然这是一个新手和常见的错误,但我找不到解决方案,因为我不知道这类问题的名称 我有两个python文件p1.py和p2.py p1.py:从不同python文件交叉调用函数失败,python,Python,当然这是一个新手和常见的错误,但我找不到解决方案,因为我不知道这类问题的名称 我有两个python文件p1.py和p2.py p1.py: from p2 import * def a(): print "Caller a --> Calling b" b() def c(): print "Caller c --> Calling d" d() a() def a(): print("Caller a --> Calling b"
from p2 import *
def a():
print "Caller a --> Calling b"
b()
def c():
print "Caller c --> Calling d"
d()
a()
def a():
print("Caller a --> Calling b")
import p2
p2.b()
def c():
print("Caller c --> Calling d")
import p2
p2.d()
a()
from p2 import *
print "p1"
p2.py:
from p1 import *
def b():
print "Caller b --> Calling c"
c()
def d():
print "Caller d --> END"
from p1 import *
print "p2"
当我运行p1.py
时,我得到下一个错误:
NameError:未定义全局名称“b”
我做错了什么?有推荐的[简短]阅读吗?您有问题
一个可能的解决方案:
p1.py:
from p2 import *
def a():
print "Caller a --> Calling b"
b()
def c():
print "Caller c --> Calling d"
d()
a()
def a():
print("Caller a --> Calling b")
import p2
p2.b()
def c():
print("Caller c --> Calling d")
import p2
p2.d()
a()
from p2 import *
print "p1"
py2.py
def b():
print("Caller b --> Calling c")
import p1
p1.c()
def d():
print ("Caller d --> END")
以及:
输出:
呼叫方a-->呼叫方b
呼叫方b-->呼叫c
呼叫方a-->呼叫方b
呼叫方b-->呼叫c
调用方c-->调用d
调用方d-->结束
调用方c-->调用d
调用方d-->结束
进程已完成,退出代码为0
你有问题
一个可能的解决方案:
p1.py:
from p2 import *
def a():
print "Caller a --> Calling b"
b()
def c():
print "Caller c --> Calling d"
d()
a()
def a():
print("Caller a --> Calling b")
import p2
p2.b()
def c():
print("Caller c --> Calling d")
import p2
p2.d()
a()
from p2 import *
print "p1"
py2.py
def b():
print("Caller b --> Calling c")
import p1
p1.c()
def d():
print ("Caller d --> END")
以及:
输出:
呼叫方a-->呼叫方b
呼叫方b-->呼叫c
呼叫方a-->呼叫方b
呼叫方b-->呼叫c
调用方c-->调用d
调用方d-->结束
调用方c-->调用d
调用方d-->结束
进程已完成,退出代码为0
是的,循环进口 现在[简短]阅读(理解示例的示例) p1.py:
from p2 import *
def a():
print "Caller a --> Calling b"
b()
def c():
print "Caller c --> Calling d"
d()
a()
def a():
print("Caller a --> Calling b")
import p2
p2.b()
def c():
print("Caller c --> Calling d")
import p2
p2.d()
a()
from p2 import *
print "p1"
p2.py:
from p1 import *
def b():
print "Caller b --> Calling c"
c()
def d():
print "Caller d --> END"
from p1 import *
print "p2"
运行p1.py时,输出为:
p1
p2
p1
这是什么意思
p1-第一行“从p2导入*”导入p2,p2依次启动“从p1导入*”,因此p1已确定(注意:p2尚未确定,这就是名称错误的原因:在您的示例中未定义全局名称“b”)
[p1的导入已完成]
p2-现在在p2中导入后的行
[p2导入完成,现在返回p1]
p1-现在在p1中导入后的行是的,循环导入
现在[简短]阅读(理解示例的示例)
p1.py:
from p2 import *
def a():
print "Caller a --> Calling b"
b()
def c():
print "Caller c --> Calling d"
d()
a()
def a():
print("Caller a --> Calling b")
import p2
p2.b()
def c():
print("Caller c --> Calling d")
import p2
p2.d()
a()
from p2 import *
print "p1"
p2.py:
from p1 import *
def b():
print "Caller b --> Calling c"
c()
def d():
print "Caller d --> END"
from p1 import *
print "p2"
运行p1.py时,输出为:
p1
p2
p1
这是什么意思
p1-第一行“从p2导入*”导入p2,p2依次启动“从p1导入*”,因此p1已确定(注意:p2尚未确定,这就是名称错误的原因:在您的示例中未定义全局名称“b”)
[p1的导入已完成]
p2-现在在p2中导入后的行
[p2导入完成,现在返回p1]
p1-现在,在p1中导入后的行可能值得一读:您有循环依赖关系。试着先把它们修好。可能重复:。不相关,但请帮你自己一个忙,不要使用通配符导入(也称为星导入)-它们会使代码变得脆弱,几乎无法维护,没有什么好的理由。这可能值得一读:您有循环依赖关系。试着先把它们修好。可能重复:。不相关,但请帮你自己一个忙,不要使用通配符导入(又名星导入)-它们会使代码变得脆弱,并且没有理由很难维护。