当前位置: 首页 > 面试题库 >

在新的终端窗口中从python执行终端命令?

郎德馨
2023-03-14
问题内容

这里的目标是在新的shell中运行新的python文件,并在现有的shell中运行现有的python文件。说我有两个文件,aaa.py和bbb.py。为了简单起见,aaa.py所做的只是…

subprocess.call('python bbb.py', shell=True)

…并且可以说bbb.py确实是…

print 'It worked'

现在的目标是在终端1中运行aaa.py,并使其在终端2中启动bbb.py。我希望存在类似下面的命令,但无法弄清楚。

subprocess.call_in_new_window('python bb.py', shell=True)

问题答案:

通常,无法从shell进行此操作。您需要做的是运行终端程序本身,或者运行一些适合您的启动程序。对于每个终端程序,执行此操作的方法都不同。

在某些情况下,os.startfile可以做您想做的事情,但这并不是通用的。

另外,请注意,一般来说,您实际上需要脚本的绝对路径,因为新的终端窗口将运行新的Shell,因此不一定具有相同的工作目录。但对于示例,我将忽略它。

使用Windows
cmd,最简单的方法是startshell命令。如果您使用的start是任何命令行程序,包括python,它将获得一个新的cmd窗口。因此,类似:

subprocess.call('start /wait python bb.py', shell=True)

OS
X具有类似的命令open。而且它是一个真实的程序,而不是shell命令,因此您不需要shell=True。但是,运行带有的命令行程序或脚本open通常不会打开新的终端窗口。实际上,它的全部目的是允许您像在Finder中双击一样运行程序,除非它是.command文件,否则它永远不会在终端中运行任何程序。

因此,您可以创建一个临时.command包装文件open。像这样(未经测试):

with tempfile.NamedTemporaryFile(suffix='.command') as f:
    f.write('#!/bin/sh\npython bb.py\n')
    subprocess.call(['open', '-W', f.name])

另外,您可以明确地告诉open使用Terminal.app,如下所示:

subprocess.call(['open', '-W', '-a', 'Terminal.app', 'python', '--args', 'bb.py'])

或者,您可以通过AppleEvents编写Terminal.app脚本。例如:

appscript.app('Terminal').do_script('python bb.py')

“执行脚本”事件将打开一个新窗口,并将其参数作为命令运行。如果要进行更详细的控制,请在AppleScript编辑器中打开脚本字典,然后查看所有您可以做的有趣的事情。

在Linux或其他* nix系统上……那么,共有65102种不同的桌面环境,启动器和终端程序。您需要对所有这些进行研究吗?

使用gnome-terminal,只需再次运行终端即可为您提供一个新窗口,并且该-x参数可让您指定初始命令,因此:

subprocess.call(['gnome-terminal', '-x', 'python bb.py'])

许多较旧的终端都尝试与兼容xterm,后者与兼容-e,因此:

subprocess.call(['xterm', '-e', 'python bb.py'])
subprocess.call(['rxvt', '-e', 'python bb.py'])

…等等

您如何知道用户正在使用哪个终端?好问题。您可以从父辈那里走过去,直到找到看起来像终端的东西。或者您可以假设每个人都拥有xterm。或者,您可以查看各种发行版如何配置默认终端并搜索所有终端。要么…



 类似资料:
  • 我知道有很多关于这个的线索,但是没有一个对我有用。以下是我试图做的: Javac并从我的java代码中运行一个文件。它适用于视窗系统,但我想让它也适用于UNIX。代码如下: 问题是,在UNIX系统上,它的行为“不可预测”,例如: 打开图像,但 它什么也没做。没有按摩。 我非常感谢您的任何意见。 更新--------------------------------------------------

  • 问题内容: 我前一段时间读过这篇文章,但似乎找不到。我试图找到一个将在终端中执行命令然后输出结果的命令。 例如:脚本将是: 它将在终端中运行该命令的结果 问题答案: 做这件事有很多种方法: 一种简单的方法是使用os模块: 子流程模块可以实现更复杂的事情:例如:

  • 问题内容: 我正在尝试从Java执行SOX命令,但不幸的是,它每次都会返回错误。其他所有SOX命令都可以正常运行!!这是代码: 当我在终端中执行相同的sox命令时,它的工作正常。我真的不明白问题是什么!是因为“ |” 符号?? 问题答案: 问题是Runtime.exec()无法理解shell概念,例如“ |”。而是尝试: 问题是exec直接运行二进制文件而不调用shell。“ |” 字符只能被外壳

  • 关于通过Java向终端发送命令,我遇到了一个非常令人困惑的问题。我有这个密码: 第一个命令是这个"useradd user-p密码-d /home/ftp/test/-s /bin/false",第二个应该是这个回显用户名:new_password|chpasswd,第一个命令工作没有任何问题,并创建了我定义的用户"服务器"变量,但当我试图执行第二个命令来改变用户传递此命令可能永远不会发生,输出为

  • 问题内容: 我正在尝试将控制台置于Java中的“原始”模式。我了解这仅适用于UNIX。 我正在使用命令 如果我直接在终端中键入命令,它将完成应有的操作。在Java中,我尝试设置如下模式: 但是终端不会进入原始模式。 我有一种感觉,这是因为Java只是在后台的虚拟终端中执行命令,而不是在活动终端中执行命令。有没有办法做到这一点? 问题答案: 由于JVM重定向了stdio / stdout / std

  • 问题内容: 我试图打开一个终端并在其中运行命令。我在用 这将打开一个新的终端,但是命令不会执行。 问题答案: 该命令将新运行的进程替换为新进程,因此,如果要在要运行的命令列表中有一个exec,则在exec运行后,其他任何命令都将不会运行。因此,您要替换为,然后在运行之后再执行任何操作。尝试以下方法: 或者如果您需要终端保持打开状态,请尝试以下操作: 如果您希望终端保持打开状态并处于bash she