从zsh启动Python脚本并停留在Python shell中



我想简化在Python外壳中运行Python脚本的过程。在Python 2中,您可以只使用execfile(path)。但在Python 3中,它更难记住:exec(open(path).read())

所以我想要一个函数来运行一个脚本,就像run(path)一样简单。我可以从Python外壳中做到这一点:

def run(filename):
source = open(filename).read()
code = compile(source, filename, 'exec')
exec(code)

然后我可以输入run(path)。这非常有效,现在我想通过每次启动Python3时定义run函数来简化事情。

我想用zsh别名或函数(比如py(配置~/.zshenv,该别名或函数启动Python并告诉它定义run函数。所以这就是我被难住的地方。这样的zsh命令会是什么样子?我尝试过,但失败了,比如:

py () {
python -c "
def run(filename): 
source = open(filename).read() 
code = compile(source, filename, 'exec') 
exec(code)" 
}

但失败得很惨:

% py
File "<string>", line 1
def run(filename):  source = open(filename).read() code = compile(source, filename, 'exec')  exec(code)
IndentationError: unexpected indent
%

即使它能工作,一旦定义了函数,它也会从Python外壳中退出。显然我不知道我在这里做什么。有指针吗?

另外…请不要以为我问的问题是对的。通常在StackOverflow上,我们会尽量避免事后猜测海报的假设。但是,如果有更好的方法让Python在启动时始终定义run函数,请继续猜测我的。

如果您只需要交互式shell使用此函数,可以将其写入文件中,然后运行python -i file_with_function.py-i选项将告诉解释器在file_with_function.py文件中的任何内容运行后进入交互式会话。

如果您想将其用于任何非交互式运行的.py文件,则可以执行以下操作之一:

  1. 创建一个包含运行函数的包,并将包安装在解释器上。有一个关于Python文档的详细指南(https://packaging.python.org/tutorials/packaging-projects/)
  2. 在PYTHONPATH环境变量上添加包含.py文件的目录,并从中导入

在传递给Python的命令中(使用python -c(,用几个空格开始函数定义。行开头的空格在Python中非常重要。如果你打开一个Python外壳并编写,你会得到同样的错误

def foo:

前面有几个空格:Python用缩进错误进行响应:意外缩进

此外,使用反斜杠字符会使所有换行符消失,其效果是在一行中定义完整的函数。这在Python中也是无效的,所以即使修复了初始空格,仍然会得到SyntaxError:无效语法

请注意,您可以使用Python的-m选项在启动Python的同时加载初始定义。你可以做

python -h

以获取有效命令行选项的列表。

最新更新