gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:02:12 24 4
gpt4 key购买 nike

关闭。这个问题需要debugging details .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

4年前关闭。




Improve this question




我开发了 2 个 python (3.x) 脚本。他们每个人都通过调用这些方法来遵循 body 中的一些基本流程
- 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() 返回我期望的结果!

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

最佳答案

您可能正在调用 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

关于python - 我的 python 正在从另一个文件调用另一个函数而不显式导入它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com