【问题标题】:How to execute code in `if __name__ == "__main__"` from another python file如何从另一个python文件执行`if __name__ ==“__main__”`中的代码
【发布时间】:2019-03-26 23:17:17
【问题描述】:

在我的 python 文件中,我有一个带有一些参数的函数,在同一个文件中,我有一个 if __name__ == "__main__" 子句,它使用一组特定的参数运行这个函数(供用户展示它的作用)。像这样,

def foo(arg1, arg2):
    pass

if __name__ == "__main__":
    arg1 = 1
    arg2 = 2
    foo(arg1, arg2)

此外,我还有另一个 pytest 使用的测试文件。我想让其中一个测试完全按照上面提到的 if 子句中的内容运行,即执行

arg1 = 1
arg2 = 2
foo(arg1, arg2)

是否可以不将代码复制到包含测试的文件中?

【问题讨论】:

  • 该块的全部意义在于无法从另一个文件访问的代码。

标签: python namespaces pytest main


【解决方案1】:

好吧,我不是这方面的专家,但是如何重定向你的 if __name__ == "__main__": 到另一个函数并从您的另一个文件中调用该函数?

文件1:

def main_file1:
  arg1 = 1
  arg2 = 2
  foo(arg1, arg2)

if __name__ == "__main__":
  main_file1()

文件2:

from file1 import *

def somefunc():
  main_file1()

但是,我不确定您为什么要这样做。通常你在整个项目中只有 1 个 main 函数来让事情滚动并从那里调用其他函数。

最终这种文件的主要功能的目的失败

【讨论】:

  • 这就是我想要的。回复您的评论:也许我对 main 函数的含义是关闭的,但我的代码的全部意义在于在 foo 中实现一些数学功能,而在 if __name__ == "__main__" 块内调用的内容只是为了展示功能。
【解决方案2】:

如果你有文件

file1.py

def foo(arg1, arg2):
    pass

if __name__ == "__main__":
    arg1 = 1
    arg2 = 2
    foo(arg1, arg2)

file2.py在同一个目录下你可以:

file2.py

from file1 import foo
arg1 = 1
arg2 = 2
foo(arg1, arg2)

您将需要像您一样重新定义arg1arg2,但这只是导入您想要的函数的问题。这将为您提供函数,但没有file1.py 的全局变量,因为它们受if __name__ == "__main__" 语句的保护

更新

如果您不想在 file2.py 内重新分配,您可以执行以下操作:

file1.py

def foo(arg1, arg2):
    pass

def new_function(): #make a new function that you can import
    arg1 = 1
    arg2 = 2
    foo(arg1, arg2)

if __name__ == "__main__":
    new_function()

file2.py

from file1 import new_function
new_function()

这还不是最糟糕的,因为您仍然包含 arg1arg2 作为局部变量,因此没有很大的命名空间问题,但是现在您可以导入它们,因为它们在 if name == main 部分中不受保护你的代码。

【讨论】:

  • 正如我在问题中提到的,我想避免复制参数分配。
  • 没有办法解决这个问题,因为它们在if name == main 中受到保护。您必须将它们从该块中取出才能访问它们。 if name == main 块的整个 目的是通过防止单独的文件/脚本访问该部分代码来防止命名空间串通。我将发布您可能想做的更新
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2015-04-04
  • 2023-02-06
  • 2020-05-16
  • 2021-05-12
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
相关资源
最近更新 更多