从不同python文件交叉调用函数失败

从不同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"

当然这是一个新手和常见的错误,但我找不到解决方案,因为我不知道这类问题的名称

我有两个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")
  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中导入后的行可能值得一读:您有循环依赖关系。试着先把它们修好。可能重复:。不相关,但请帮你自己一个忙,不要使用通配符导入(也称为星导入)-它们会使代码变得脆弱,几乎无法维护,没有什么好的理由。这可能值得一读:您有循环依赖关系。试着先把它们修好。可能重复:。不相关,但请帮你自己一个忙,不要使用通配符导入(又名星导入)-它们会使代码变得脆弱,并且没有理由很难维护。