如何在 PyCharm IDE 中使用子进程模块调用基于 ncurses 的应用程序?

Mat*_*tic 5 python subprocess ncurses pycharm

我想使用 subprocess 模块从 python 启动一个基于 ncurses 的应用程序。

基于 ncurses 的应用程序是 TABARI,一个事件提取系统。事件提取的结果保存到文件中。我想从 python 脚本启动它,等待它终止,然后读取结果文件。

代码示例如下所示:

import subprocess
proc = subprocess.Popen('TABARI -a ' + file, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print proc.communicate()
Run Code Online (Sandbox Code Playgroud)

运行PyCharm程序时这段代码的结果是:

('', 'Error opening terminal: unknown.\n')
Run Code Online (Sandbox Code Playgroud)

当我从终端启动的 python 解释器(与 PyCharm 中使用的相同)运行相同的代码时,输​​出是:

('...lots of text...', '')
Run Code Online (Sandbox Code Playgroud)

我尝试了几件事,包括使用 shell=False,将 bufsize 设置为 -1,以及调查 os.environ 变量。PyCharm 的 os.environ 输出和终端之间的一个可疑差异是“TERM”变量,它在 PyCharm 中不存在,在终端中等于“xterm”。

我将不胜感激任何帮助。

the*_*aul 2

我具体不知道 PyCharm 或 TABARI,但从错误消息来看,听起来 PyCharm 正在执行您的代码,而无需将其连接到终端。可能它这样做是为了收集程序输出并将其显示在 GUI 窗口中,或者因为作者觉得启动像 xterm 这样的终端模拟器并在其中运行代码不太干净。

\n\n

从这里的一些其他问题来看,听起来没有任何真正好的方法可以让 PyC​​harm 在运行代码时提供终端仿真环境。对于这个问题有一些建议,但听起来不太令人满意。

\n\n

阻力最小的方法可能就是每次从终端运行程序。如果这是不可接受的,您可以检查代码以查看 stdin 是否是终端 ( os.isatty(0)),如果不是,则显式启动像 xterm 这样的终端模拟器并在其下重新调用您的代码。或者,如果您实际上不需要在子进程运行时与其交互,您可以分配自己的伪终端主/从对并运行连接到从属的代码。这些事情都比它们应该的更复杂,所有这些的完整解释需要足够的文字来填写整个手册,但这里有一些很好的资源:

\n\n\n