2

在 Python 中,是否有类似的东西atexit。Atexit 旨在用作“拆解”。我需要类似“设置”的东西。在我运行这个 setUp 的任何脚本之前,它都会被执行。

编辑

我应该指出我有几个单独执行的小脚本。所有这些脚本都连接到相同的逻辑。我想在我们的项目中引入依赖注入,但例如python-inject需要在运行每个脚本之前进行配置。我不想在所有脚本的开头都设置相同的inject.configure(myConfiguration)内容,只是为了设置它们。

现在我要看看@en_Knight 关于 PYTHONSTARTUP 的建议,然后再回来。

解决方案 @en_Knight 提供的关于 PYTHONSTARTUP 的内容肯定会奏效。虽然我拥有所有的部署能力:] 我觉得这也不是一个好主意。我解决了修改python-inject源的问题

谢谢你的帮助!

4

1 回答 1

2

请注意,使用 atexit 时,首先需要注册一个函数。我建议做一些类似的事情来强制执行“atenter”功能。

例如

# start of my code
atenter() # place 1

def main():
   atenter() # place 2
   # run main code

if __name__ == '__main__':
   atenter() # place 3
   main()

在大多数情况下,地方 2 似乎是去的地方。地方 1 的缺点是任何导入你的 main 函数的文件都会不小心调用 atenter。如果在某些平台上进行多处理,这也会导致问题。if __name__ == "__main__": 做什么?

位置 3 的问题是,如果您将包装器(如“RunExamples”命令行实用程序或 GUI)放在另一个文件中的主函数之上,则不会调用 atenter。在文档中指定 main 不应该被调用两次可能就足够了,尽管这也可以强制执行。

如果您正在寻找更优雅的外观,您可以创建一个“atenter”装饰器,并用它包装您的主要功能。使用单例模式或类似的东西,你可以确保它只执行一次,不管它被调用多少次


一种替代方法。来自 python 文档

Python启动

如果这是一个可读文件的名称,则该文件中的 Python 命令会在第一个提示以交互模式显示之前执行。该文件在执行交互式命令的同一名称空间中执行,以便在其中定义或导入的对象可以在交互式会话中使用而无需限定。您还可以更改此文件中的提示 sys.ps1 和 sys.ps2。

修改这个环境变量可以让你在指定的情况下执行一个函数。这不是一个好的部署策略(它取决于本地计算机上满足的几个条件,包括运行 python 的模式)。但是,如果您在部署时对 python 环境有很强的控制力,它可能更符合您的需求,并且可能是可行的。

于 2015-12-11T16:53:53.173 回答