有没有办法在python启动时始终执行脚本? (R中类似的site.profile)

时间:2018-06-27 21:29:33

标签: python startup

在R编程语言中,有一个site.profile文件,该文件定义一些R进程在启动时执行的代码。 Python中有类似的功能吗?

编辑:为明确起见,如果用户从命令行调用python,并且从另一个进程中派生了python,则也应执行此脚本(例如,如果用户的脚本使用子进程来生成另一个python)。

3 个答案:

答案 0 :(得分:1)

Python机制称为... site。它是一个自动导入并设置环境的模块。如果找到模块sitecustomize.pyusercustomize.py,它将也导入它们。因此,这两个位置是您要放置在站点范围和个人定制中的内容,这些个性化定制要成为Python环境的永久组成部分。有关更多详细信息,请参见site documentation

答案 1 :(得分:1)

如果您只希望在交互式会话中使用它(而不是每次使用python myscript.py./myscript运行脚本或使用python -m mymodule运行模块时都发生),那么您想要的就是环境变量PYTHONSTARTUP

  

如果这是可读文件的名称,则在以交互方式显示第一个提示之前,将执行该文件中的Python命令。该文件在与执行交互式命令相同的名称空间中执行,因此在交互式会话中无需限定即可使用其中定义或导入的对象……

当然,如果您希望这种情况永远存在,则需要在某个适当的全局位置设置此环境变量,例如,在大多数* nix平台上的shell配置文件,或者在macOS上都配置了shell配置文件和已启动的配置文件,或Windows上“控制面板”的相应部分(几乎所有新版本的Windows都会更改相应部分,但通常名称中带有“系统”)。

如果您希望所有 all 用户(而不只是当前用户)都发生这种情况,那么有关如何设置系统范围的环境变量的详细信息应特定于平台,否则,我们的想法是一样。


如果您希望在每个 Python会话中都发生这种情况,即使其他程序正在运行Python脚本,而您甚至都不知道它正在执行此操作……您想要的是{{ 1}}或usercustomize,如site文档中所述:

  

此模块在初始化期间自动导入。可以使用解释器的-S选项禁止自动导入。

     

...

     

在执行了这些路径操作之后,尝试导入名为sitecustomize的模块,该模块可以执行任意特定于站点的自定义。它通常是由系统管理员在sitecustomize目录中创建的。

     

此后,尝试导入名为site-packages的模块,如果usercustomize为true,则该模块可以执行任意特定于用户的自定义。该文件旨在在用户site-packages目录中创建(请参见下文),该目录是sys.path的一部分,除非被ENABLE_USER_SITE禁用...

因此,您想找到一个适当的位置来覆盖此位置。首先尝试:

-s

然后,如果这没有给您python3 -m site (可能仅适用于相当老的Python,但以防万一……),也请执行以下操作:

sys.path

如果您希望仅对当前用户进行此自定义,则要在python3 -c 'import sys; print('\n'.join(sys.path))' 列出的usercustomize.py目录中创建USER_SITE文件。如果该目录不存在,请创建它。

如果希望所有用户都可以使用它,则需要python3 -m site目录之一中的sitecustomize.py文件。问题是可能已经存在一个。例如,大多数linux发行版的内置Python软件包都有自己的sys.path模块。如果有,sitecustomize会告诉您它在哪里。然后,您可以进行编辑,也可以复制,编辑该副本,并将该副本放置在比原始副本python3 -c 'import sitecustomize; print(sitecustomize.__file__)更早的位置。通常,sys.path可能比/usr/local更好,而/usr可能比site-packages更好。

答案 2 :(得分:0)

环境变量PYTHONSTARTUP指向的文件将在启动交互式python会话时运行

并且USER_SITE/usercustomize.py将用于非交互式python会话。

运行python -c "import site; print(site.USER_SITE)"来找到USER_SITE的目录位置