Python subprocess.call运行bash脚本,如果从终端运行,而不是从debian菜单运行

时间:2015-10-20 07:37:44

标签: python bash menu

我有一个python应用程序,如果单击一个特定按钮,它应该运行一个bash脚本。我把应用程序放到菜单中,创建了.desktop文件,除了subprocess.call之外,一切看起来都很好。我还尝试使用os.system()和其他几个解决方案,如果应用程序是从终端启动的话,所有这些解决方案都正常工作,但是如果它是通过菜单图标启动的话。有人知道怎么修这个东西吗?我想让它在没有终端窗口的情况下从菜单运行,但无法找到类似于我的主题

3 个答案:

答案 0 :(得分:1)

好的,这两个答案都有效,因为问题不在于丢失的终端,而在于ME。

我在我的应用程序中留下了一个代码会话,最初的目的是调用脚本执行,但它是从另一个部分调用的,所以修复了相对路径

subprocess.call('./script')

subprocess.call('absolute_path_to_script') 
  • 这立即成功了。我也尝试改为绝对路径,但按钮从未调用过那个事件所以...我的错误,感谢你的时间来帮助我

答案 1 :(得分:0)

尝试在call语句中添加 shell = True subprocess doc

subprocess.call("exit 1", shell=True)

答案 2 :(得分:0)

这是因为GUI进程与stdout / stderr分离并改为重定向到loging。请解释一下你的bash脚本在做什么,而且,它显然是在没有窗口的情况下运行的。要检查,让它写一些文件,你会看到脚本已经运行。或者你提到你不喜欢你的进程有一个控制台窗口,但你的bash脚本应该在一个中运行。

如果是这样,首先使用subprocess.call()调用终端,并使用命令调用bash脚本。

请更准确,并清楚说明您的需求,以便我们为您提供帮助。

如果您真的需要启动终端,我会为您整理一些代码。

在Linux上启动新终端的问题是有许多不同的桌面环境。

他们每个人通常都会建立自己的终端计划。

使用哪一个???你可以尝试直到你成功:

import subprocess
script = "~/full_path_to_your_bash_script.sh"
# Uncomment following line to ensure execution by bash and remove potential problems with permissions.
#script = "bash "+script
# Commands to call (add some more if you remember any):
commands = [
    ['gnome-terminal', '-x', script],
    # xterm is usually present:
    ['xterm', '-e', script],
    ['rxvt', '-e', script]
    ]
ok = 0
for command in commands:
    try:
        subprocess.call(command)
        ok = 1; break
    except OSError, e:
        if e.errno==2: continue # No such file or directory - skip non-existing terminal and try another
        raise # Some other OSError occurred
    except: raise
if not ok: raise RuntimeError, "No terminal available!"