您将数据写入一个临时文件,然后在编辑器返回时读取它。如果运行,
git commit您会注意到git在做同样的事情。
只要子进程具有
stdin并
stdout连接到终端的交互过程,就没有多余的步骤来交互式地启动程序。
与编辑器打交道有一个陷阱-
他们中的许多人将通过在同一目录中写入临时文件并将其移至旧文件上来保存文件。这使保存操作完全原子化(忽略电源可能会耗尽),但意味着我们必须在编辑器运行后重新打开临时文件,因为旧文件句柄将指向不再属于该文件的文件。文件系统(但仍在磁盘上)。
这个陷阱意味着我们不能使用
TemporaryFile或
NamedTemporaryFile,我们必须使用较低级别的工具,以便我们可以关闭文件描述符并重新打开文件而不删除它。
import tempfileimport subprocessimport osdef edit(data): fdes = -1 path = None fp = None try: fdes, path = tempfile.mkstemp(suffix='.txt', text=True) fp = os.fdopen(fdes, 'w+') fdes = -1 fp.write(data) fp.close() fp = None editor = (os.environ.get('VISUAL') or os.environ.get('EDITOR') or 'nano') subprocess.check_call([editor, path]) fp = open(path, 'r') return fp.read() finally: if fp is not None: fp.close() elif fdes >= 0: os.close(fdes) if path is not None: try: os.unlink(path) except OSError: passtext = edit('Hello, World!')print(text)Git示例代码非常复杂,因为它没有使用像Python的
subprocess模块这样的高级库。如果您阅读了
subprocess模块源代码,则其中的很大一部分将看起来像链接的Git源代码(用Python代替C编写的除外)。



