【发布时间】:2015-09-21 19:18:46
【问题描述】:
我一直在深入研究 Python 和 GUI 应用程序,并取得了相当大的进步。但是,我想就如何进行以下操作提供一些建议:
- 我已经使用 python(2.6.6 - 由于它是遗留系统而无法升级系统)和显示多个按钮的 gtk 创建了一个 GUI 应用程序,例如应用 1、应用 2、应用 3
- 当我单击一个按钮时,它会运行一个 bash shell 脚本。该脚本将设置一些必需的环境变量,然后执行另一个外部应用程序(使用这些环境变量)
示例:
1) 使用点击按钮 app1
2) GUI 然后启动app1.sh设置环境变量
3) GUI 然后运行external_app1# external_app1 是一个示例应用程序
# 这需要一些环境
# 启动前要设置的变量
示例app1.sh 内容:
#/bin/bash
export DIR=/some/location/
export LICENSE=/some/license/
export SOMEVAR='some value'
注意:由于环境的配置方式,它必须先启动 shell 脚本来设置环境等,然后再启动外部应用程序。 shell 脚本将被锁定,因此一旦我测试过它们,任何人都无法对其进行编辑。
所以我考虑过如何让 python GUI 执行此操作,到目前为止,我正在执行以下操作:
- 当用户点击app1时,检查app1.sh是否可执行/可读,如果不是,返回错误
- 创建另一个 helper 脚本,假设
helper1.sh将包含app1.sh后跟external_app1命令,然后让 python 通过以下命令执行helper1.sh脚本:李>
subprocess.Popen(helper1.sh, shell=True, stdout=out, stderr=subprocess.PIPE, close_fds=True)
示例helper1.sh 内容:
#!/usr/bin/env bash
source app1.sh # sets up env variables
if [ $? = 0 ]; then
external_app & # Runs the actual application in background
else
echo "Error executing app1.sh" 2>/dev/stderr
fi
这样做是为了让帮助脚本在其自己的子 shell 中执行,这样我就可以运行多个环境设置/外部应用程序(app2、app3 等)。
所以我问:
- 有没有更好的或者更 Pythonic 的方式来做到这一点?有人可以指出我正确的方向吗?
- 在日志记录和错误处理方面,如何在不阻塞/冻结 GUI 的情况下有效地从帮助脚本(例如
helper1.sh)捕获标准错误或标准输出?使用线程还是队列?
谢谢。
【问题讨论】:
-
这些答案有帮助吗? subprocess 似乎处理环境变量和执行...stackoverflow.com/questions/26236126/…
标签: python linux bash shell user-interface