【问题标题】:Python equivalent of ~/.bashrc相当于 ~/.bashrc 的 Python
【发布时间】:2016-05-08 00:04:36
【问题描述】:

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

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

【问题讨论】:

  • __init__.py
  • 不支持为每个 Python 脚本运行(__init__.py 可用于确保在导入包或其子项时运行某些代码),但对于自定义交互式解释器,将PYTHONSTARTUP 环境变量设置为指向一个文件,其中包含要在移交给交互式解释器之前运行的 Python 命令,例如export PYTHONSTARTUP=$HOME/.pythonrc.
  • ok,写下你所有的函数,并在需要的时候把它放在/usr/lib/pythonX.y/dist-packages 中导入。简单!
  • @ShadowRanger 这正是我想要的。将此作为答案,我会接受。

标签: python bash terminal


【解决方案1】:

运行每个 Python 脚本并不是一个好主意,因为它会破坏命名空间;每Zen of Python

命名空间是一个很棒的主意——让我们做更多这样的事!

也就是说,__init__.py 可用于确保在导入包或其子项时运行某些代码,并且要自定义交互式解释器,请将PYTHONSTARTUP 环境变量设置为指向包含 Python 命令的文件在移交给交互式解释器之前运行,例如export PYTHONSTARTUP=$HOME/.pythonrc.

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

【讨论】:

  • 这个语法cls = lambda: print("\033c\033[3J", end='') 例如只能被python3识别。为了避免这种情况,可以这样做:from __future__ import print_functioncls = lambda: print("\033c\033[3J", end='')cls()
【解决方案2】:

这是个坏主意——不要这样做。真的。 (命名空间污染是一个严重的问题,编写只能在您自己的机器上运行而在其他任何地方都无法运行的代码对您没有任何好处;相反,如果您将代码打包在一个模块中,您可以正确地发布和分发它)。

但是,如果您坚持,请参阅 the site module,特别是它的用户自定义行为:

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

因此,您可以创建一个 usercustomize 模块,该模块可根据您的需要进行热补丁。


作为这种热补丁的一个例子:

def myfunc():
  print 'hello'

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

【讨论】:

  • 嗯!如果有一些简短的系统特定功能,比如一些批处理命令,还是不好?
  • 简写:是的,不好。 “显式优于隐式”是 Python 方式的一部分——如果您使用的是本地的东西,则应该明确表明您存在于每个命名空间中,而不是隐式存在。
  • ...如果您想要的只是对本地 shell 的扩展,也许使用 IPython 及其扩展机制?这样你至少不会干涉脚本的行为。见ipython.readthedocs.org/en/stable/config/extensions/index.html
  • 我不清楚这应该如何工作。例如,我使用函数def test_function(): passusercustomize.py 添加到/usr/lib/python2.7/dist-packages。我确保site.ENABLE_USER_SITE == True。但是,调用test_function() 会产生NameError,表明该脚本永远不会运行。
  • @Jake,仅仅因为它被导入并不意味着它就在你的默认命名空间中。但是,它确实为您提供了一个热补丁平台,因此您可以(例如)直接访问和修改__main__ 命名空间(这是交互式外壳的默认设置)。我已经编辑了一个演示。
【解决方案3】:

基本上我想在脚本中定义一些全局 Python 函数,并确保每当我在我的 机器,或者每当我启动 Python 终端时

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

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

ipython profile create 

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

ipython profile create <name>

加载&lt;name&gt; 配置文件:

ipython --profile=<name>

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

ipython locate profile

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

但要直截了当,您可以在启动 ipython 时通过将这些行添加到配置文件中来加载任意函数和变量:

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

我引用 the IPython docsipython_config.py 中的 cmets:

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 = []

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2011-06-05
    • 2010-10-29
    • 2011-06-25
    • 2020-09-28
    • 2011-06-25
    • 2014-10-31
    • 2011-10-10
    • 2012-01-15
    相关资源
    最近更新 更多