问题 Python相当于〜/ .bashrc


对于那些不熟悉的人 在〜/ .bashrc,它是Unix shell存在的可自定义脚本 Bash。当新的终端会话开始时,将运行此特定于用户的文件。用户可以在此文件中编写常用变量,函数和环境设置的脚本,从而在打开终端窗口时自动加载它们。

Python有类似的东西吗?基本上我想在脚本中定义一些全局Python函数,并确保每当我在我的机器上运行Python脚本时,或者每当我启动Python终端时它们都被加载。我想知道这种行为是否已经存在,或者是否有一种直接的方式来实现它。


6216
2018-01-30 05:24


起源

看到 __init__.py。 - e0k
为每个Python脚本运行不是受支持的行为(__init__.py 可用于确保在导入包或其子代的情况下运行某些代码,但是为了自定义交互式解释器,请设置 PYTHONSTARTUP 环境变量指向具有Python命令的文件,该命令在切换到交互式解释器之前运行,例如, export PYTHONSTARTUP=$HOME/.pythonrc。 - ShadowRanger
看到 docs.python.org/2/library/site.html - Charles Duffy
确定编写所有功能并将其放入 /usr/lib/pythonX.y/dist-packages 在需要时导入它。简单! - Ja8zyjits
@ShadowRanger这正是我想要的。做出这个答案,我会接受。 - Jake


答案:


为每个Python脚本运行都不是一个好主意,因为它打破了命名空间;每 Python的禅宗

命名空间是一个很棒的主意 - 让我们做更多的事情吧!

那说, __init__.py 可用于确保在导入包或其子代时运行某些代码,并且为了自定义交互式解释器,请设置 PYTHONSTARTUP 环境变量指向具有Python命令的文件,该命令在切换到交互式解释器之前运行,例如, export PYTHONSTARTUP=$HOME/.pythonrc

只要确保 PYTHONSTARTUP 文件包含Py2和Py3的合法语法,因为没有 PYTHON3STARTUP,它将针对两个版本的Python运行。


5
2018-01-30 06:08





这是一个坏主意 - 不要这样做。真。 (名称空间污染是一个严重的问题,通过编写仅适用于您自己的机器而不是其他地方的代码,您无需任何帮助;相反,如果您将代码打包在模块中,则可以正确地发布和分发它)。

但是,如果你坚持,请参阅 网站模块,特别是其用户自定义行为:

在此之后,尝试导入名为的模块 usercustomize,如果,可以执行任意用户特定的自定义 ENABLE_USER_SITE 是真的。此文件旨在在用户site-packages目录(见下文)中创建,该目录是其中的一部分 sys.path 除非被禁用 -s。一个 ImportError 将被默默地忽略。

因此,您可以创建一个 usercustomize 热心问世的模块。


作为此类热修补的示例:

def myfunc():
  print 'hello'

main_ns = __import__('__main__')
main_ns.myfunc = myfunc

5
2018-01-30 05:37



嗯!如果有一些简短的系统特定功能,如某些批处理命令,仍然不好? - Ja8zyjits
简短形式:是的,不好。 “显式优于隐式”是Python方式的一部分 - 如果你使用的是本地的东西,那么应该明确的是你不是隐式地存在于每个命名空间中。 - Charles Duffy
...如果你想要的东西只是本地shell的扩展,可能使用IPython及其扩展机制?这样你至少不会干涉脚本的行为。看到 ipython.readthedocs.org/en/stable/config/extensions/index.html - Charles Duffy
我不清楚它应该如何工作。例如,我补充说 usercustomize.py 至 /usr/lib/python2.7/dist-packages 与功能 def test_function(): pass。我确保了 site.ENABLE_USER_SITE == True。但是,打电话 test_function() 产生一个 NameError,表明该脚本永远不会运行。 - Jake
@Jake,因为它的导入并不意味着它在魔法的默认命名空间中;但是,它 不 为您提供一个平台,您可以(例如)直接进入并修改 __main__ namespace(交互式shell的默认设置)。我已经编辑了一个演示。 - Charles Duffy


本质上我想在脚本中定义一些全局Python函数,并确保每当我在我的脚本上运行python脚本时它们都被加载   机器,或者每当我启动一个Python终端

我们来谈谈你的第二个选择。启动终端时,有多种方法可以加载函数和变量。我建议使用 IPython的 而不是默认的Python终端。但是,要在不安装IPython的情况下执行此操作,请修改环境变量 PYTHONSTARTUP。 您确实无法划分配置文件。

安装IPython后,您需要初始化其配置文件。 要创建默认配置文件:

ipython profile create 

为了解决其他答案中的共同主题,全局变量和函数是一个坏主意,特别是如果它们是隐式定义的。但是,您可以在启动ipython时定义和加载单独的配置文件。 要创建这样的配置文件:

ipython profile create <name>

加载 <name> 简介:

ipython --profile=<name>

现在修改配置文件。运行此命令以查看它们的位置:

ipython locate profile

你应该找到 ipython_config.py。我建议阅读它,它有非常有用的评论。

但是为了达到这一点,您可以在启动ipython时通过将这些行添加到配置文件来加载任意函数和变量:

c.InteractiveShellApp.exec_lines = [ "def p(s): print s" ]
c.InteractiveShellApp.exec_files = [ "/path/of/script.py" ] 

我在引用 IPython文档 和评论 ipython_config.py

96  # List of files to run at IPython startup.                                      
97  # c.TerminalIPythonApp.exec_files = []                                          
98                                                                                 
99  # lines of code to run at IPython startup.                                      
100 # c.TerminalIPythonApp.exec_lines = []

4
2018-01-30 06:23