我的python正在从另一个文件调用另一个函数,而没有显式导入它
我开发了2个python(3.x)脚本。他们每个人都通过调用这些方法来遵循身体中的一些基本流程 -我的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
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