我的python正在从另一个文件调用另一个函数,而没有显式导入它

我的python正在从另一个文件调用另一个函数,而没有显式导入它,python,python-3.x,namespaces,Python,Python 3.x,Namespaces,我开发了2个python(3.x)脚本。他们每个人都通过调用这些方法来遵循身体中的一些基本流程 -process_params() -运行(参数) 现在我有了一个用例,第一个python脚本在第二个python脚本中调用特定函数非常有用 因此,为了防止process_params()和run(params)的名称冲突,我执行了以下操作: -将两个文件放在同一目录中。 -在我的第一个python脚本中,我基本上有以下内容: sys.path.append(".") from script2 imp

我开发了2个python(3.x)脚本。他们每个人都通过调用这些方法来遵循身体中的一些基本流程 -
process_params()
-
运行(参数)

现在我有了一个用例,第一个python脚本在第二个python脚本中调用特定函数非常有用

因此,为了防止
process_params()
run(params)
的名称冲突,我执行了以下操作: -将两个文件放在同一目录中。 -在我的第一个python脚本中,我基本上有以下内容:

sys.path.append(".")
from script2 import needed_function
令我恐惧和惊讶的是,当我调用“script1”时,它正在调用script2的
进程参数()
,即使我没有导入它

然后我尝试创建一个简单的小测试用例来演示这个意外的行为。然而,我失败了;通过使用本地
进程参数()
,测试用例返回了我期望的结果


这意味着在我的实际代码中有一些非常奇怪的东西(我弄糟了),当我只从script2导入了一个不同的方法时,script1将调用script2的
process_params()
,而不是它自己的本地实例。因为这个问题可能与我实际脚本的代码是“独特的”;但是脚本很长,而且有机密信息,我不能在这里发布。是否有任何人可以就我如何处理此问题提出建议或理论?

您可能正在从模块级别调用
process\u params

下面显示了您正在描述的行为

s1.py

s2.py

当我运行s1.py时,它会打印以下内容

$ python s1.py 
Script 2 foo() called
Script 1 foo() called
needed_function called
您需要检查
\uuuu name\uuuu==“\ uuuuuu main\uuuuu”
以保护您的呼叫。无论何时导入模块,
\uuuuuu name\uuuuu
都将包含模块名称。只有当它是直接运行的模块时,它才会是
\uuuuu main\uuuu

所以,稍加修改就可以

# 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

您可能在script2中调用了该函数。您是否依赖于
needed\u函数中的模块级变量
?发布一个好的问题不必公开私有代码或数据。事实上,你甚至会被鼓励把所有不相关的东西都去掉,把它们贴在这里。您还可以查看,这可能是由您的问题决定的。当您导入模块时,所有模块都将被执行,即使您仅从其中导入一个内容。如果uuu name uuu==“uuuu main uuu”guard使模块级语句只执行该文件称为“main”脚本。谢谢大家。。。。是的,我完全忘记了使用if 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