Python 如何在流程完成后终止终端

Python 如何在流程完成后终止终端,python,bash,shell,ubuntu,Python,Bash,Shell,Ubuntu,我正在为我的项目学习bash脚本和python,我想在终端执行完成后杀死它。 我在一个终端上运行我的进程,当我执行它时,它会打开一个新的终端并执行请求的操作,然后在完成后,新的终端必须关闭,这是不发生的。 我的代码是: import os os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 当我运行这个程序时,它将打开新的终端并在其中执行,执行后“pwd”是 import os os.sy

我正在为我的项目学习bash脚本和python,我想在终端执行完成后杀死它。 我在一个终端上运行我的进程,当我执行它时,它会打开一个新的终端并执行请求的操作,然后在完成后,新的终端必须关闭,这是不发生的。 我的代码是:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
当我运行这个程序时,它将打开新的终端并在其中执行,执行后“pwd”是

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
无法向那里发送任何命令。
完成后,我想杀死终端,因为下一次执行时,我想打开新的终端

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
我尝试了这个方法,效果很好,但不知道如何添加python脚本:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
a=`tty`    
echo $a   
b=`tty | sed 's/\/dev//'`  
echo $b  
c=`ps aux | grep $a | grep 'bash$' | awk '{print $2}'`  
echo $c  
d= `$c | awk '{print $1}'   
kill -9 $d  
寻求建议,请指导我获得解决方案。
提前感谢。

终端在其最后一个子进程退出时关闭。这将实现我认为您想要的:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system("xfce4-terminal -e 'bash -c \"echo hello ; /bin/bash ; exit 0\"'")
我测试过了

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
在回复评论时添加

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
Ubuntu
/usr/bin/usb设备中有一个shell脚本,它打印到stdout,然后退出。如果我运行Python

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system("xfce4-terminal -e /usr/bin/usb-devices")

然后出现一个终端,显示脚本的输出,然后终端退出。这真的再简单不过了。

终端在其最后一个子进程退出时关闭。这将实现我认为您想要的:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system("xfce4-terminal -e 'bash -c \"echo hello ; /bin/bash ; exit 0\"'")
我测试过了

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
在回复评论时添加

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
Ubuntu
/usr/bin/usb设备中有一个shell脚本,它打印到stdout,然后退出。如果我运行Python

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system("xfce4-terminal -e /usr/bin/usb-devices")

然后出现一个终端,显示脚本的输出,然后终端退出。这真的再简单不过了。

让我们回顾一下,仔细看看您发布的一行主要代码:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'")
它有什么作用

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
  • 它使用Python调用shell(
    os.system
    ),这通常不是一个好主意,原因很多
  • 在该外壳内,它启动xfce4终端
  • 在xfce4终端内部,它运行bash。xfce4终端可能在另一个bash中运行此bash
  • 在这个新的bash中,它运行testing.sh
  • 最后,由于我不清楚的原因,它运行了另一个bash
流程层次结构是什么样子的

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
shell (whichever you use to launch this thing, likely bash)
    python
        shell (the system default, possibly bash)
            xfce4-terminal
                bash (replaced by another bash at the end, "exec bash")
                    bash
                        testing.sh
你知道这看起来有多疯狂吗?想想你真正想要完成的事情。它可能看起来更像这样:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
shell
    python
        testing.sh
怎么做

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
import subprocess
subprocess.check_call(['./testing.sh'])
如果您确实需要启动xfce4终端:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
subprocess.check_call(['xfce4-terminal', '-e', './testing.sh'])

让我们回顾一下,仔细看看您发布的一行主要代码:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'")
它有什么作用

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
  • 它使用Python调用shell(
    os.system
    ),这通常不是一个好主意,原因很多
  • 在该外壳内,它启动xfce4终端
  • 在xfce4终端内部,它运行bash。xfce4终端可能在另一个bash中运行此bash
  • 在这个新的bash中,它运行testing.sh
  • 最后,由于我不清楚的原因,它运行了另一个bash
流程层次结构是什么样子的

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
shell (whichever you use to launch this thing, likely bash)
    python
        shell (the system default, possibly bash)
            xfce4-terminal
                bash (replaced by another bash at the end, "exec bash")
                    bash
                        testing.sh
你知道这看起来有多疯狂吗?想想你真正想要完成的事情。它可能看起来更像这样:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
shell
    python
        testing.sh
怎么做

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
import subprocess
subprocess.check_call(['./testing.sh'])
如果您确实需要启动xfce4终端:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
subprocess.check_call(['xfce4-terminal', '-e', './testing.sh'])

我已经尝试过类似的方法,现在它已经起作用了:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system("xfce4-terminal -e 'bash -c \"./testing.sh ; sleep 20 ; exit 0\"'")

谢谢你的帮助。

我已经尝试过类似的方法,现在可以使用了:

import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'") 
os.system("xfce4-terminal -e 'bash -c \"./testing.sh ; sleep 20 ; exit 0\"'")


谢谢你的帮助。

你为什么要首先打开一个新的终端?不清楚你所说的“无法向那里发送任何命令”是什么意思。是否要在终端中键入命令?然后看看我的答案。如果您想将命令从Python发送到终端中的shell,那么您将需要更多的命令。您能描述一下您想要做什么,以及期望的结果吗?我想你是在寻找一个你不需要的问题的解决方案。@ThomasFenzl:testing.sh svn会更新,然后它会生成系统,然后它会创建deb。你为什么要首先打开一个新的终端?不清楚你所说的“不能向那里发送任何命令”是什么意思。是否要在终端中键入命令?然后看看我的答案。如果您想将命令从Python发送到终端中的shell,那么您将需要更多的命令。您能描述一下您想要做什么,以及期望的结果吗?我认为您正在寻找一个不需要的问题的解决方案。@ThomasFenzl:testing.sh执行svn更新,然后执行系统构建,然后创建deb。您退出的是最后一个/bin/bash,而不是终端。@ThomasFenzl“终端在其最后一个子进程退出时关闭。”你测试过了吗?这取决于OP真正想要达到的目标。我把它读作“他希望航站楼关闭”,这与你的回答不符。同意。问题是不明确的。@msw:我试过了,但在命令完成后它不会退出终端。你退出的是最后一个/bin/bash,而不是终端。@ThomasFenzl“终端在其最后一个子进程退出时关闭”。你测试过吗?这取决于OP实际试图实现的目标。我把它读作“他希望航站楼关闭”,这与你的回答不符。同意。问题是不明确的。@msw:我试过了,但在命令完成后它不会退出终端。我想他想预加载环境,然后得到一个交互式shell。是的,进程树是疯狂的,但没有更清晰的意图或
测试。sh
做了什么,这很难知道。@John Zwinck:我以前试过,但它只是打开了一个终端,然后突然关闭了。。所以我试过这个。现在你说它“突然关上了”,但在你最初的问题中,你抱怨终端没有在你想要的时候关闭。我认为我们需要你非常非常清楚地解释你在这里试图实现的实际目标,自上而下。否则,它只会在乱七八糟的东西上加上更多的创可贴。@JohnZwinck:当我尝试使用你的解决方案时,它只是弹出式终端和
import os    
os.system(""xfce4-terminal -e 'bash -c \"./testing.sh; exec bash\"'")