我想在一个单独的文件中定义一堆命令以便整理。
def cmd1():
print("calling cmd1")
import define_cmd2
cmd2()
然后是define_cmd2.py:
cmd1()
def cmd2():
print("called cmd2")
它告诉我cmd1()
未定义。如何调用import以便我可以在导入调用之前使用/编辑/调用定义的内容?
答案 0 :(得分:0)
python文件(例如define_cmd2.py
)应该是自包含的。一个非常基本的要求是,如果你想使用一个名为cmd1
的函数,它必须在define_cmd2.py
或在调用函数之前导入的某个文件中定义。
然而,这听起来更像XY problem。你究竟想做什么?
答案 1 :(得分:0)
首先应该了解Python导入的工作原理。
在模块上调用import
的第一次时间,它会被执行。生成的命名空间包含所有函数和变量定义,用于创建在命名空间中引用的模块对象,以及sys.modules
中引用的模块对象。下次导入时,导入仅引用sys.modules
中的现有模块。
为避免循环导入导致的错误,在运行代码之前,实际上首先创建模块对象,以便进一步导入已经在sys.modules
中看到现有模块,而不是尝试重新执行代码一遍又一遍。
在您的特定情况下,如果您要使用define_cmd2
的内容,则需要从define_cmd1
明确导入define_cmd1
。其次,您需要正确引用导入的名称:
<强> define_cmd1 强>:
def cmd1(): print("calling cmd1") import define_cmd2 define_cmd2.cmd2()
<强> define_cmd2 强>
import define_cmd1 import define_cmd1.cmd1() def cmd2(): print("called cmd2")
粗体项是您需要添加的代码。
澄清一下,运行define_cmd
时会发生什么:
def
语句将创建一个函数define_cmd1.cmd1
。import
将尝试加载define_cmd2
import
中的define_cmd2
将不会执行任何操作,因为sys.modules['define_cmd1']
已经存在,这意味着它已加载或正在加载。define_cmd1.cmd1()
将会运行。def
语句将创建一个函数define_cmd2.cmd2
define_cmd1
define_cmd2.cmd2