2016-01-30 68 views
11

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

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

+0

请参阅['__init __。py'](http://stackoverflow.com/questions/448271/what-is-init-py-for)。 – e0k

+3

为每个Python脚本运行不是受支持的行为('__init __。py'可用于确保某些代码是在运行包或其子代的情况下运行的),但为了自定义交互式解释器,请将'PYTHONSTARTUP'环境变量指向具有Python命令的文件,以便在交付给交互式解释器之前运行,例如'export PYTHONSTARTUP = $ HOME/.pythonrc'。 – ShadowRanger

+1

请参阅https://docs.python.org/2/library/site.html –

回答

5

;每:

命名空间是一个喇叭好主意 - 让我们做更多的这些!

这就是说,__init__.py可以用来确保某些代码,如果一个包或它的孩子都是进口的运行,并定制交互式解释,设置PYTHONSTARTUP环境变量指向一个文件,Python命令运行在交给交互式口译员之前,例如export PYTHONSTARTUP=$HOME/.pythonrc

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

5

这是一个坏主意 - 不要这样做。真。 (命名空间污染是一个严重的问题,通过编写只能在自己的机器上和其他地方无法使用的代码,您没有任何优势;相反,如果您将代码打包到模块中,则可以正确发布和分发代码)。

但是,如果你坚持,看到the site module,并且特别是它的用户定制行为:

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

因此,您可以创建一个模块,用于打开心脏的内容。


这样热修补的一个例子:运行为每个Python脚本不是一个好主意,因为它打破了命名空间

def myfunc(): 
    print 'hello' 

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

恩!如果像一些批处理命令那样有一些短系统特定的功能,那么又会如何呢? – Ja8zyjits

+0

简短形式:是的,不好。 “显式比隐式更好”是Python方法的一部分 - 如果您使用的是本地方法,则应明确表示您不是隐式地存在于每个名称空间中。 –

+1

...如果你想要的东西只是本地shell的扩展,可能使用IPython及其扩展机制?这样你至少不会干涉脚本的行为。见http://ipython.readthedocs.org/en/stable/config/extensions/index.html –

4

基本上我想在一个脚本中定义的全球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" ] 

我引用the IPython docs和意见在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 = []