gpt4 book ai didi

python - 从 Python 脚本运行 vi

转载 作者:行者123 更新时间:2023-11-28 16:36:33 27 4
gpt4 key购买 nike

我正在尝试从 Python (2.6.4) 脚本中使用 vanilla vi(Solaris 10 上的/usr/bin/vi)打开一个文件,但我所做的一切似乎都不起作用。我想让脚本将一些数据放在一个临时文件中,然后在 vi 中打开该文件供用户编辑。理想情况下,脚本会阻止对 vi 的调用并在用户完成时继续执行,但我可以满足于将脚本进程转换为 vi 进程(通过 exec 或其他方式)的解决方案。

我尝试了以下方法,但对于其中的每一个,vi 都会将文件的第一页打印到屏幕上,然后退出并显示“输入读取错误”:

os.execlp('vi', 'vi', filename)

os.system('vi' + ' ' + filename)

subprocess.call('vi' + ' ' + filename, shell=True)

对于上下文,这里是完整的代码:

#!/usr/bin/python

import sys
import os
import subprocess

fname = "." + str(os.getpid()) + ".pvi.tmp"
f = open(fname, 'w')

f.write("## Remember to save this to a new file if you want to keep it!\n")

for line in sys.stdin:
f.write(line + "\n")

f.close()

# These all give the error "Input read error"
#os.execlp('vi', 'vi', fname)
#os.system('vi' + ' ' + fname)
#subprocess.call('vi' + ' ' + fname, shell=True)

os.unlink(fname)

我基本上是在尝试将管道过程模拟到 vi 中,但我的版本不支持它(vi - 不起作用)。我会将它们通过管道传输到这个脚本,然后将输出写入一个临时文件并在 vi 中打开它。

如有任何帮助,我们将不胜感激!

最佳答案

问题是 vi 的标准输入是从您的脚本继承的,这意味着它附加到管道而不是终端。试试这个:

os.system('vi' + ' "' + fname + '" </dev/tty >/dev/tty 2>&1')

如果 fname 来自用户输入,这是很危险的,因为它可能包含嵌入式 shell 元字符并导致执行任意命令。但是在您的代码中似乎并非如此;您正在确定性地构建值(value)。

替代方法是使用其中一个 exec 调用来绕过 shell,但是您还必须在 Python 中进行 I/O 重定向,这会变得有点笨拙。是否值得付出努力取决于您的应用程序的风险敞口。但同样,在您的特定情况下,这似乎不是问题。

关于python - 从 Python 脚本运行 vi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com