Python脚本无法通过键盘快捷方式运行

4

我有许多脚本都是通过键盘快捷方式运行的,例如将截图上传到imgur并在剪贴板中放置链接,用于数字化绘图等。

我有这个当前脚本,它只能从终端运行,而且无法通过键盘快捷方式运行。

我正在尝试通过Scientific Linux 6.4上的系统>首选项>键盘快捷键来运行它。

如下为脚本内容,以便查看是否有任何特定问题导致其无法工作。

#!/usr/bin/python
import fileinput, os

import subprocess

from pygments import highlight
from pygments.lexers import get_lexer_by_name, guess_lexer
import pygments.formatters as formatters

#stdin = "\n".join([line for line in fileinput.input()])

p = subprocess.Popen(["xclip", "-selection", "primary", "-o"], stdout=subprocess.PIPE)
code, err = p.communicate()

if not err:

  lexer = guess_lexer(code)

  print lexer.name

  imageformatter = formatters.ImageFormatter(linenos=True, cssclass="source", font_name="Liberation Mono")
  formatter = formatters.HtmlFormatter(linenos=True, cssclass="source")

  HTMLresult = highlight(code, lexer, formatter)
  Jpgresult = highlight(code, lexer, imageformatter, outfile=open("syntax.png", "w"))

  with open("syntax.html", "w") as f:

    f.write("<html><head><style media='screen' type='text/css'>")
    f.write(formatters.HtmlFormatter().get_style_defs('.source'))
    f.write("</style></head><body>")
    f.write(HTMLresult)
    f.write("</body></html>")


#  os.system("pdflatex syntax.tex")

  os.system("firefox syntax.html")

  os.system("uploadImage.sh syntax.png")



else:
  print err

它的工作方式是使用xclip提取剪贴板选择的内容,对文本使用pygments,然后创建一个HTML文档并在Firefox中打开它,并将图像上传到imgur(使用我拥有的另一个脚本,我知道它百分之百有效),然后将该图像URL放回剪贴板。

它所在的bin文件夹位于我的路径中。

我尝试了所有以下方法:

script
script.sh (where this file is just a shell script which calls the python script)
/home/will/bin/script
/home/will/bin/script.sh

键盘首选项 中的 命令 栏中更改内容。

如果我将这些脚本的内容更改为类似于 notify-send "hello" 的内容,那么它会产生通知消息,因此我相当自信这是一个与脚本有关而不是 键盘快捷键 菜单的问题。


我会在脚本的不同位置放置 notify-send "hello" 来隔离导致问题的确切行。然后你就可以继续了。也许你的脚本的某些部分需要一些环境,而当通过键盘快捷方式调用脚本时,你没有这些环境? - jhutar
1
另一个重要的事情是尝试捕获脚本的输出。如果您有包装器script.sh,可以尝试通过类似于/home/will/bin/problematic_script.py &>/tmp/script.log的方式将stdout和stderr(以及其他所有内容)重定向到文件中。也许这会提供更多线索? - jhutar
4个回答

2
我遇到了完全相同的问题。这是我如何解决的:
首先,我编写了一行shell脚本,看起来像这样python /home/user/Scripts/script.py,其中“/home/user/Scripts/script.py”是我的Python位置。我将此shell脚本放在可执行路径中。
接下来,当我要创建快捷方式时,我没有告诉计算机运行文件。我告诉计算机启动一个终端,并将shell脚本作为该终端的参数。在我的情况下,它看起来像这样:xfce4-terminal -x ralia.sh
这对我有用。

我不再使用那台电脑了,但如果这真的是一个“解决方案”,那么它就太荒谬了! - will
1
荒谬吗?是的。可行吗?是的。我找到了更好的方法。您可以剪切掉shell脚本中间人,并将“xfce4-terminal -x python /home/user/scripts/python_scripts.py”放在启动器行上。 - Cole Webb

1
问题出在 "with open("syntax.html", "w") as f:" 这一行。 当使用脚本的键盘快捷方式时,请在脚本中使用文件的完整路径。

而不是:

with open("syntax.html", "w") as f:

使用:

with open("/home/user/my_script_folder/syntax.html", "w") as f:

将脚本中的所有文件名更改为完整路径,它就可以正常工作了。


1

我曾经遇到过类似的问题。问题在于必须使用完整路径才能通过键盘快捷键使其正常工作。

在我的情况下,这种方法并没有起作用:

#!/bin/bash
python scrypt.py

然而,这确实有效:

#!/bin/bash
python /home/user/bin/scrypt.py

0
可能的问题是您交互式 shell 和处理键盘快捷键的守护程序或程序的环境之间的 $PATH 不同。
在“import os”后尝试:
open("/tmp/debug.txt", "w").write(os.environ["PATH"])

然后使用键盘快捷键运行它,并查看/tmp/debug.txt

→ 尝试使用绝对路径来运行二进制文件,如果这不起作用,请考虑jhutar的建议。


我有其他脚本在同一个文件夹中以完全相同的方式运行,但它们都可以正常工作。 - will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接