Python 在新终端中运行辅助脚本
运行辅助python脚本时:Python 在新终端中运行辅助脚本,python,Python,运行辅助python脚本时: 是否可以在新终端中运行子进程.Popen,或子进程.call或甚至execfile?(与运行脚本的当前终端不同的终端) 或者,如果在运行我的程序(main)之前,我首先打开了两个终端,那么我可以将辅助脚本指向第二个终端吗?(以某种方式获取打开终端的ID,然后使用其中的特定终端来执行子流程) 例如,应该首先调用要运行的两个子流程,first.py,然后才调用第二个子流程,second.py。因为两个脚本first.py和second.py是相互依赖的(就像firs
- 是否可以在新终端中运行
,或子进程.Popen
或甚至子进程.call
?(与运行脚本的当前终端不同的终端)execfile
- 或者,如果在运行我的程序(main)之前,我首先打开了两个终端,那么我可以将辅助脚本指向第二个终端吗?(以某种方式获取打开终端的ID,然后使用其中的特定终端来执行子流程)
first.py
,然后才调用第二个子流程,second.py
。因为两个脚本first.py
和second.py
是相互依赖的(就像first.py
进入等待模式,直到运行second.py
,然后first.py
恢复,我不知道如何使它们之间的通信在子进程方面工作。)
框架(Ubuntu,python 2.7)如果您正在使用,您可以指定要在哪个目标中运行命令:
tmux send -t foo.0 ls ENTER
因此,如果您已经创建了一个tmux会话foo.0
,您应该能够:
my_command = 'ls'
tmux_cmd = ['tmux', 'send', '-t', 'foo.0', my_command]
p = subprocess.Popen(tmux_cmd)
您可以指定要在其中执行命令的终端窗口的
tty
:
ls > /dev/ttys004
但是,我建议使用tmux方法来获得更好的控制(请参阅我的另一个答案)。我想您需要类似这样的方法
subprocess.call(['xterm','-e','python',script])
好的旧xterm
几乎没有任何装饰;在Freedesktop系统上,可以运行xdg terminal
。在Debian上,尝试
然而,使您的程序需要X11在大多数情况下是错误的。更好的解决方案是运行子流程,并将输出输出到日志文件(或套接字,或其他),然后分别在这些文件上运行
tail-f
(在不同的终端中,或通过ssh
从不同的服务器运行,或将输出输出到支持rsyslog
的记录器,或…)它使您的程序简单、模块化,不受“方便”依赖性的影响。您所说的“在新的终端中”是什么意思?你想做什么?你链接到的问题与终端窗口无关。你想做什么?@DisplayName我正在尝试类似于subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.stdout,creationflags=subprocess.CREATE\u NEW\u CONSOLE)
wherecommand=[“python”,“test.py”]
但我得到了“'module'对象没有属性‘CREATE\u NEW\u CONSOLE’”。显然,CREATE_NEW_控制台仅适用于Windows请回答您的问题并在那里添加代码。相关:(考虑提供GUI,或者使用x-terminal-emulator
)感谢您的建议,很遗憾,我没有使用tmux。有没有其他选择?很遗憾,创建新的控制台不是一个选项,因为这只适用于windows机器。谢谢,我想我非常赞同你的建议,很棒的东西。两个终端都打开,脚本开始运行,但我现在如何监控它们的输出,output=p.stdout.readline().strip()
似乎不再工作了,因为现在它们位于不同的终端中。更有用的方法可能是启动一个简单的程序,在不同的终端中接收并打印主程序的输出,甚至只需登录到一个文件,并在单独的终端上对日志文件运行常规的tail-f
。哦,我明白了,听起来很合理!既然子流程p在xterm中,我如何接收它的输出?不要在xterm
中运行子流程。关键是要让它在xterm中工作。。。因为我希望子流程位于不同的终端。
subprocess.call(['xterm','-e','python',script])