【问题标题】:subprocess.Popen breaks terminal on exitsubprocess.Popen 在退出时中断终端
【发布时间】:2019-07-20 16:02:12
【问题描述】:

我正在尝试使用 python 打开一个程序。我的目标是在 python 启动子进程后让终端对我可用。

import subprocess
subprocess.run(['feh', 'foo.png']) # locks program until I close the image = no go
subprocess.Popen('feh', 'foo.png']) # works but breaks new line in terminal

在终端,我必须运行

$ stty sane

修复,但我看不到我正在输入的内容...

我已尝试将其添加到程序的末尾:

import atexit
def fixTerm():
    subprocess.run(['stty', 'sane'])
atexit.register(fixTerm)

但没有快乐。程序在退出时仍然会中断终端(或者如果我使用 .run() 则会挂起

我在多个 linux 平台上都遇到过这个问题,目前正在尝试灵活使用 Arch Linux & i3

其他没有乐趣的尝试:

subprocess.Popen(['feh', 'foo.png'], shell=True)
subprocess.Popen(['feh', 'foo.png'], shell=False)
subprocess.Popen(['feh', 'foo.png'],
    stdout=subprocess.PIPE, universal_newlines=True)

不确定接下来要尝试什么。非常感谢任何帮助。

这是破坏终端的整个程序。

#! /usr/bin/python
import matplotlib.pyplot as plt
import numpy as np
import subprocess

x = np.linspace(0, 2, 100)
plt.plot(x, x**2, label='quadratic')

plt.savefig('foo.png', bbox_inches='tight')
p = subprocess.Popen(['feh', 'foo.png'])

我不确定这与“A. Albershteyn”的解决方案有什么区别,但这不会导致问题,而上述程序会。

【问题讨论】:

  • 你能更详细地描述你的用例吗?为什么要从 python 运行程序然后使用终端?也许我们可以利用这些信息找到更好的解决方案
  • feh 是一个图形查看器。我的程序将在最后一次操作时打开一张图片。我不想在图片打开的整个过程中将自己锁在控制台之外。注意python主程序已经关闭,但是打开feh的子进程还在运行。无论是立即关闭图形还是继续工作,我都必须使用 $ stty sane 清理我的控制台。不是我每次运行这个程序时都想做的事情

标签: linux python-3.x subprocess i3


【解决方案1】:

对我来说很好用,feh 没有输出。 “换行”是什么意思?

~ 
➔ python -c "import subprocess; subprocess.Popen(['feh', '42.png'])"

~ 
➔ echo "feh is open"
feh is open

~ 
➔ echo "I closed it"
I closed it

~ 
➔ 

【讨论】:

  • 我在终端中运行了您的示例,但它们没有导致终端无换行问题。 IE 它工作得很好。我编辑了我的原始帖子以显示确实导致问题的程序。如果在您的程序中运行良好,我看不出我的程序会出现什么问题?
  • @posop 你的例子对我来说很好。 Python 脚本释放终端,feh 保持打开状态;当我关闭它不会导致任何换行符。你如何运行你的脚本?
猜你喜欢
  • 2021-03-27
  • 2020-02-14
  • 2020-02-06
  • 2014-12-02
  • 2019-06-12
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2022-11-08
相关资源
最近更新 更多