Python 运行 在任何脚本之前

Python run before any script

在Python中有没有类似atexit的东西。 Atexit 用于 "tear down"。我需要像 "set up" 这样的东西。在任何脚本之前,我 运行 将执行此设置。

编辑

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

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

解决方案 @en_Knight 提供的有关 PYTHONSTARTUP 的内容肯定会起作用。尽管我拥有所有的部署能力 :] 我觉得这也不是一个好主意。我解决了修改 python-inject

来源的问题

感谢您的帮助!

注意,使用atexit时,首先需要register a function。我建议做一些类似的事情来强制执行 "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。如果在某些平台上进行多重处理,这也会导致问题。 What does if __name__ == "__main__": do?

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

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


另一种方法。 From the python docs

PYTHONSTARTUP

If this is the name of a readable file, the Python commands in that file are executed before the first prompt is displayed in interactive mode. The file is executed in the same namespace where interactive commands are executed so that objects defined or imported in it can be used without qualification in the interactive session. You can also change the prompts sys.ps1 and sys.ps2 in this file.

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