为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

交互式爱情 2019-10-21 10:23:31

这里的目标是在新的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)


查看完整描述

3 回答

?
桃花长相依

通常,没有办法从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。或者,您可以查看各种发行版如何配置默认终端并搜索所有终端。要么…


查看完整回答
反对 回复 2019-10-21
?
守着星空守着你

您将无法实现这一目标,至少不会像您正在考虑的那样简单。我怀疑您是因为“终端窗口”而在谈论Mac。

您也许可以使用X Window系统来实现它,但是您需要设置一些东西,X服务器,权限等来实现它。

如今,这类事情通常会违反正常的安全边界。假设您下载的程序符合您的建议。它会弹出一个窗口(终端)(您不可见),该窗口具有与您相同的特权。它将继续读取您的所有目录和文件,并将它们发送到程序的创建者。您可能对此不满意。在整个过程中,您认为自己在玩游戏,然后退出,第二个shell继续运行。

Windows和Shell有点脱节。


查看完整回答
反对 回复 2019-10-21
?
慕瓜9086354

这可能是一条评论,但由于我还不能...


在Windows中,您可以执行以下操作:


subprocess.call('python bb.py', creationflags=subprocess.CREATE_NEW_CONSOLE)


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信