我的python从另一个文件调用另一个函数而不显式导入它

时间:2017-09-12 23:50:57

标签: python python-3.x namespaces

我开发了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()而不是它自己的本地实例。因为问题可能是我的实际脚本代码的“独特”;但脚本很长,它也有机密信息,我不能在这里发布。有没有人建议我如何处理这个问题的建议或理论?

1 个答案:

答案 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