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”。
我将不胜感激任何帮助。
我具体不知道 PyCharm 或 TABARI,但从错误消息来看,听起来 PyCharm 正在执行您的代码,而无需将其连接到终端。可能它这样做是为了收集程序输出并将其显示在 GUI 窗口中,或者因为作者觉得启动像 xterm 这样的终端模拟器并在其中运行代码不太干净。
\n\n从这里的一些其他问题来看,听起来没有任何真正好的方法可以让 PyCharm 在运行代码时提供终端仿真环境。对于这个问题有一些建议,但听起来不太令人满意。
\n\n阻力最小的方法可能就是每次从终端运行程序。如果这是不可接受的,您可以检查代码以查看 stdin 是否是终端 ( os.isatty(0)),如果不是,则显式启动像 xterm 这样的终端模拟器并在其下重新调用您的代码。或者,如果您实际上不需要在子进程运行时与其交互,您可以分配自己的伪终端主/从对并运行连接到从属的代码。这些事情都比它们应该的更复杂,所有这些的完整解释需要足够的文字来填写整个手册,但这里有一些很好的资源: