我想在python脚本中调用一个编辑器来请求用户输入,就像crontab e
或git commit
一样。
下面是我目前运行的代码片段(将来,我可能会使用$EDITOR而不是vim,以便用户可以根据自己的喜好进行定制)。
tmp_file = '/tmp/up.'+''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6))
edit_call = [ "vim",tmp_file]
edit = subprocess.Popen(edit_call,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True )
我的问题是,通过使用Popen,它似乎阻止了我与python脚本的i/o进入正在运行的vim副本,而且我无法找到一种方法将i/o传递给vim。
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal
从python调用CLI程序,将控制权交给它,然后在完成后将它传递回来的最佳方式是什么?
6条答案
按热度按时间ne5o7dgx1#
调用
$EDITOR
很简单。我已经编写了这样的代码来调用编辑器:这里的优点是库可以处理临时文件的创建和删除。
3bygqnnd2#
在Python3中:
'str' does not support the buffer interface
对于python3,使用
initial_message = b""
声明缓冲字符串。然后使用
edited_message.decode("utf-8")
将缓冲区解码为字符串。结果:
nzkunb0c3#
Package
python-editor
:更多详细信息,请访问:https://github.com/fmoo/python-editor
pes8fvy94#
click是一个很好的命令行处理库,它有一些实用工具,click.edit()是可移植的,并且使用EDITOR环境变量。我在编辑器中输入了
stuff
这一行。注意,它是以字符串的形式返回的。不错。查看文档https://click.palletsprojects.com/en/7.x/utils/#launching-editors我的整个经历:
f8rj6qna5#
PIPE是问题所在。VIM是一个依赖于stdin/stdout通道是终端而不是文件或管道的应用程序。删除stdin/stdout参数对我很有效。
我会避免使用os.system,因为它应该被subprocess模块取代。
uoifb46i6#
接受的答案对我不起作用。
edited_message
保持与initial_message
相同,正如评论中所解释的,这是由vim保存策略造成的。有可能的变通方法,但它们不能移植到其他编辑器。相反,我强烈建议使用
click.edit
函数。使用它,您的代码将看起来像这样:Click是一个第三方库,但如果您正在编写控制台脚本,则可能无论如何都应该使用它。
click
toargparse
与requests
tourllib
相同。