我想简化在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
文件,则可以执行以下操作之一:
- 创建一个包含运行函数的包,并将包安装在解释器上。有一个关于Python文档的详细指南(https://packaging.python.org/tutorials/packaging-projects/)
- 在PYTHONPATH环境变量上添加包含
.py
文件的目录,并从中导入
在传递给Python的命令中(使用python -c
(,用几个空格开始函数定义。行开头的空格在Python中非常重要。如果你打开一个Python外壳并编写,你会得到同样的错误
def foo:
前面有几个空格:Python用缩进错误进行响应:意外缩进。
此外,使用反斜杠字符会使所有换行符消失,其效果是在一行中定义完整的函数。这在Python中也是无效的,所以即使修复了初始空格,仍然会得到SyntaxError:无效语法。
请注意,您可以使用Python的-m
选项在启动Python的同时加载初始定义。你可以做
python -h
以获取有效命令行选项的列表。