【问题标题】:Start application (needing user interaction) in a separate console window在单独的控制台窗口中启动应用程序(需要用户交互)
【发布时间】:2020-03-27 20:53:53
【问题描述】:

我知道关于这个主题有很多问题,但似乎没有一个可以提供能解决我所有要求的答案。

我的要求

  • 启动另一个应用程序(应该支持所有类型的应用程序:需要用户输入的长时间运行的进程、快速结束的简单应用程序或需要很长时间的应用程序)
  • 还应该能够启动立即结束的应用程序(例如:'git status')
  • 需要在新的控制台窗口中启动
  • 即使在命令完成后控制台窗口仍应保持活动状态以查看应用程序输出。
  • 需要跨平台(Windows 和 Linux)

我想使用子进程模块。我已经尝试使用选项 CREATE_NEW_CONSOLE

subprocess.Popen(("git", "status"), close_fds=True, creationflags=subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW, shell=True)

但是:

  • 它实际上不起作用。我看不到窗口正在启动,或者它可能正在启动但在命令执行后退出太快。
  • 这仅适用于 Windows。想知道是否有办法在所有平台上始终如一地做到这一点?

【问题讨论】:

  • 一些程序运行系统脚本(bash/bat),该脚本运行预期的程序和pause程序,所以窗口等待结果直到你按下某个键。

标签: python subprocess popen


【解决方案1】:

一种方法是使用子进程打开一个新的控制台窗口并在该窗口中运行命令。在 Linux 上,可以使用“-e”标志后跟命令来实现。

例如(基于https://stackoverflow.com/a/3531426

x-terminal-emulator -e "bash -c \"git status; exec bash\""

将打开默认终端的新窗口并运行命令

bash -c "git status; exec bash"

在那个窗口中。在 Python 中,这看起来像

subprocess.Popen('x-terminal-emulator -e "bash -c \\"git status; exec bash\\""', shell=True)

最后运行“exec bash”会在控制台窗口中打开一个新的 shell 并阻止它立即退出。


根据this answer,在Windows上你可以使用“start cmd /k”然后运行命令。我没试过,但大概是这样的

subprocess.Popen('start cmd /k git status', shell=True)

会成功的。

【讨论】:

  • 虽然它是一种可行的解决方案,但在 Linux 上,一个很大的缺点是在拨打电话之前需要知道安装了哪个终端。例如,我有“konsole”,但不知道其他人有什么!!!
  • 命令“x-terminal-emulator”应该在大多数系统上打开默认终端模拟器,并且应该仍然可以使用“-e”选项。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2010-10-27
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多