【问题标题】:How to perform a cd command and execute additional command in a new terminal from a python script?如何从 python 脚本执行 cd 命令并在新终端中执行附加命令?
【发布时间】:2020-09-25 22:18:32
【问题描述】:

我正在尝试在 ubuntu18 上运行一个 python 脚本,它只会打开一个新的终端/选项卡,导航到一个特定的文件夹,然后执行一个命令。但是由于我缺乏知识,这个简单的任务看起来非常艰巨。 预期:

In the python script
$cd /home/metabase
$java -jar metabase.jar 

我的代码:

try1:
cmd = "gnome-terminal --tab 'cd /home/metabase/java -jar metabase.jar; read'"
os.system(cmd)
New tab opens but nothing happens

try2:
subprocess.call(['cd /home/metabase/', 'java -jar metabase.jar'])
Error:No such file or directory

我尝试了许多其他组合。但是导致新选项卡未打开或新选项卡打开但在同一目录中并且什么也不做。 我对这个问题做了一些阅读。似乎我正在创建这些子进程,因此当我制作 CD 时,它什么也不做。无论如何,我查看了许多类似的 stackoverflow 线程,但我仍然迷路了。任何方向将不胜感激。谢谢

【问题讨论】:

    标签: python linux bash operating-system


    【解决方案1】:

    用 bash 命令打开一个新的gnome-terminal 窗口的命令是:

    gnome-terminal -- bash -c 'your command'
    

    在你的情况下:

    gnome-terminal -- bash -c 'cd /home/metabase; java -jar metabase.jar; read'
    

    确保这首先在 shell 中工作。然后你可以从 Python 调用它:

    subprocess.call(["gnome-terminal", "--", "bash", "-c", "cd /home/metabase; java -jar metabase.jar; read"])
    

    【讨论】:

    • 太棒了。有用。但是父终端被关闭。我想保持开放。这怎么可能?
    【解决方案2】:

    为什么要更改目录?如果你愿意,你可以直接做:

    os.system('java -jar /home/metabase/metabase.jar')将返回进程退出值,0表示成功。

    请记住,os.system 将在子 shell 中执行作为字符串传递的命令。

    如果您不想生成新的 shell,可以使用:

    subprocess.call(['java', '-jar', '/home/metabase/metabase.jar'])这种方式没有启动系统shell,所以第一个参数必须是可执行文件的路径。

    【讨论】:

    • 谢谢你们的cmets。我尝试了@dejdej 的建议。问题是,它不会在新终端中打开,尽管本机 cmd 在同一个终端上工作。有什么建议吗?
    猜你喜欢
    • 2016-01-09
    • 2011-04-13
    • 2020-05-14
    • 2017-01-15
    • 1970-01-01
    • 2013-10-18
    • 2019-08-04
    • 2020-05-14
    相关资源
    最近更新 更多