python - 在单独的控制台窗口中启动应用程序(需要用户交互)
问题描述
我知道关于这个主题有很多问题,但似乎没有一个问题能提供解决我所有要求的答案。
我的要求:
- 启动另一个应用程序(应该支持所有类型的应用程序:需要用户输入的长时间运行的进程、快速结束的简单应用程序或需要很长时间的应用程序)
- 还应该能够启动立即结束的应用程序(例如:'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。想知道是否有办法在所有平台上始终如一地做到这一点?
解决方案
一种方法是使用子进程打开一个新的控制台窗口并在该窗口中运行命令。在 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 并阻止它立即退出。
根据这个答案,在 Windows 上,您可以使用“start cmd /k”然后运行该命令。我没试过,但大概是这样的
subprocess.Popen('start cmd /k git status', shell=True)
会成功的。
推荐阅读
- swift - facebook登录跳转到另一个页面
- c++builder - 全局声明 TBitmap
- android-recyclerview - 如何使用 Image 或 ImageSlider 滚动 recyclerview
- python - 如何定义涉及 for 循环的迭代函数,其中迭代器 i,j,l.. 也用于定义的迭代函数
- ios - 备份自制IOS应用
- php - 使用不带 $_POST 的 url 中的值检索数据库记录
- notepad++ - 如何在记事本++中自动复制标记的文本
- python-3.x - 如何指定 unittest.mock.sentinel 的类型?
- php - 如何根据表格上填写的答案显示图片?
- java - HotSwap Wicket HTML 文件在 Intellij maven + tomcat 中不起作用