我想使用 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()
这段代码在PyCharm中运行程序时的结果是:
('', 'Error opening terminal: unknown.\n')
当我从终端启动的 python 解释器运行相同的代码(与 PyCharm 中使用的相同)时,输出为:
('...lots of text...', '')
我尝试了几件事,包括使用 shell=False、将 bufsize 设置为 -1 以及调查 os.environ 变量。 PyCharm 和终端的 os.environ 输出之间的一个可疑区别是“TERM”变量,该变量在 PyCharm 中不存在,等于终端中的“xterm”。
我将不胜感激任何帮助。
我具体不了解 PyCharm 或 TABARI,但从错误消息来看,听起来 PyCharm 正在执行您的代码,而无需将其连接到终端。可能它这样做是为了收集程序输出并将其显示在 GUI 窗口中,或者因为作者认为启动像 xterm 这样的终端模拟器并在其中运行代码不太干净。
从这里的一些其他问题来看,似乎没有任何真正好的方法可以让 PyCharm 在运行代码时提供终端仿真环境。有一些建议关于这个问题 https://stackoverflow.com/questions/17008372/pycharm-how-to-launch-for-a-standard-terminal-to-solve-an-issue-with-curses,但听起来不太令人满意。
阻力最小的方法可能就是每次从终端运行程序。如果这是不可接受的,您可以检查代码以查看 stdin 是否是终端(os.isatty(0)
),如果没有,请显式启动一个终端模拟器(例如 xterm)并在其下重新调用您的代码。或者,如果您实际上不需要在子进程运行时与其交互,您可以分配自己的伪终端主/从对并运行连接到从属的代码。这些事情都比它们应该的更复杂,所有这些的完整解释需要足够的文字来填写整个手册,但这里有一些很好的资源:
-
伪终端的维基百科条目 http://en.wikipedia.org/wiki/Pseudo_terminal,对于一些非常一般的背景
-
xterm(1) 的手册页 http://linux.die.net/man/1/xterm,了解如何使用特定命令而不是 shell 启动的信息
-
pty(7) 的手册页 http://man7.org/linux/man-pages/man7/pty.7.html- 解释与 pty/tty 设备交互的机制
-
Python pty 模块 https://docs.python.org/2/library/pty.html,如果您想创建一个伪终端主/从对并通过普通 Python 与其交互
-
来自旧版 Linux 内核手册的解释 http://www.win.tue.nl/~aeb/linux/lk/lk-10.html关于进程组和会话如何与终端所有权相关
-
UNIX® 环境中的高级编程:第二版的摘录
作者:W.理查德·史蒂文斯、斯蒂芬·A·拉戈 http://infohost.nmt.edu/~eweiss/222_book/222_book/0201433079/ch09lev1sec6.html有关终端控制的更多信息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)