我开发了2个python(3.x)脚本。他们每个人都通过调用这些方法来遵循身体的一些基本流动
- process_params()
- run(params)
我现在有一个用例,我的第一个python脚本在我的第二个python脚本中调用一个特定的函数很有用。
因此,为了防止process_params()
和run(params)
的名称冲突,我执行了以下操作:
- 将两个文件放在同一目录中。
- 在我的第一个python脚本中,我基本上遵循:
sys.path.append(".")
from script2 import needed_function
令我惊讶的是,当我打电话给“script1”时,它正在调用script2的process_params()
,即使我没有导入它!!!
然后我尝试创建一个小的简单测试用例来演示这种意外行为。但是,我失败了;测试用例使用本地process_params()
返回我的预期!
这意味着在我的实际代码中有一些非常奇怪的东西(我搞砸了),当我只从script2导入一个不同的方法时,script1将调用script2的process_params()
而不是它自己的本地实例。因为问题可能是我的实际脚本代码的“独特”;但脚本很长,它也有机密信息,我不能在这里发布。有没有人建议我如何处理这个问题的建议或理论?
答案 0 :(得分:1)
您可能正在从模块级别调用process_params
。
以下显示了您描述的行为
s1.py
from s2 import needed_function
def foo():
print("Script 1 foo() called")
foo()
needed_function()
s2.py
def needed_function():
print("needed_function called")
def foo():
print("Script 2 foo() called")
foo()
当我运行s1.py时,打印以下内容
$ python s1.py
Script 2 foo() called
Script 1 foo() called
needed_function called
您需要检查__name__ == "__main__"
以保护您的通话。无论何时导入模块,__name__
都将包含模块名称。只有当它直接运行的模块才会是__main__
。
因此,略有修改
# s3.py
from s4 import needed_function
def foo():
print("Script 3 foo() called")
if __name__ == "__main__":
foo()
needed_function()from s4 import needed_function
def foo():
print("Script 3 foo() called")
if __name__ == "__main__":
foo()
needed_function()
# s4.py
def needed_function():
print("needed_function called")
def foo():
print("Script 4 foo() called")
if __name__ == "__main__":
foo()
并且可能是期望的结果
$ python s3.py
Script 3 foo() called
needed_function called