【问题标题】:How can I run a Python script from Ubuntu Dash?如何从 Ubuntu Dash 运行 Python 脚本?
【发布时间】:2019-08-07 04:48:43
【问题描述】:

我已经编写了 hello.py(一个基本的“hello world”程序)并且希望能够在我的 Ubuntu 机器上快速运行它,方法是按 Win 键打开 Dash,然后输入脚本的名称(或类似的东西)。

但是,当我在 Dash 中键入 hello.py 时,它会在编辑器中打开文件而不是执行它。我添加了一个 shebang 行 #!/usr/bin/env python3 并运行 chmod u+x hello.py,它仍然在编辑器中打开文件。

我尝试创建一个 hello.sh shell 脚本来运行 Python 脚本,但是当我在 Dash 中键入它的名称时,该 shell 脚本也会在编辑器中打开。

另外,我尝试按 Alt-F2 并显示类似于 Windows 的 Win-R 的内容,但是当我输入 python3 hello.py 时,它不会显示终端窗口来显示任何 print() 输出。

有没有办法通过在 Dash 中输入 Python 脚本的名称来运行它?还是有另一种简单的方法来运行任意 Python 脚本?本质上,我想要的是类似于按下 Win-R 时出现的 Windows 运行对话框,它可以运行系统 PATH 上的任何程序。

【问题讨论】:

  • 我不认为你可以像这样从 ubuntu dash 启动 python 脚本。如果我错了,请纠正我,但您尝试这样做的方式是,Ubuntu dash 将尝试找到默认应用程序来打开 *.py 文件,这通常是一个文本编辑器。你需要制作类似hello_world.desktop 的东西,它又应该包含执行hello_world.py 的指令。看看这个可能对你有帮助askubuntu.com/a/64237
  • 我在这里遗漏了一些东西。如果我在终端中启动 dash (/usr/bin/dash) 并启动脚本(以您提到的所有形式),我会得到正确的结果。您能否添加更多详细信息(可能是屏幕截图)?
  • 我没有 /usr/bin/dash,但我有 /bin/dash。但是,当我运行它时,我只会得到一个新的类似 bash 的 $ 提示符。 “Ubuntu Dash”是指按下 Windows 键时出现的类似开始菜单的用户界面:askubuntu.com/questions/299295/what-is-the-dash#299297

标签: python ubuntu


【解决方案1】:

(在 18.04 测试) 在~/.local/share/applications(仅供您的用户使用)或/usr/share/applications(供所有用户使用)中创建此文件。
文件名必须以 .desktop 结尾。

[Desktop Entry]
Name=hello.py
Exec=/path/to/hello.py
Type=Application
Categories=GTK;GNOME;Utility;

请注意,脚本在后台运行,除非您将日志记录配置到脚本中的文件,否则错误会被吞没。

如果您希望它在控制台中运行,您可以这样做(不过,当脚本退出时控制台将关闭):

[Desktop Entry]
Name=hello.py
Exec=gnome-terminal -- /path/to/hello.py
Type=Application
Categories=GTK;GNOME;Utility;

如果您需要图标,可以使用更多功能,以限制其运行的桌面环境等 - 此处的文档:https://developer.gnome.org/integration-guide/stable/desktop-files.html.en

假设

  • hello.py 可由当前用户执行
  • hello.py 有一个有效的 shebang
  • 路径必须是绝对路径(即不是相对路径,也不能使用 shell 扩展,例如 ~ 或变量)

【讨论】:

  • 我将它保存为 hello.desktop(我认为这是我应该使用的文件扩展名),但是当我在 Dash 中键入“hello”时它不会出现。在 hello.desktop 上执行 chmod +x 没有帮助。
  • 我做了一些可能有所帮助的编辑 - 特别是关于将其强制到前台
  • 快速猜测:~/hello.py 不起作用,但 /home/ben/hello.py 起作用
  • 不幸的是,这不是 ~ 问题。 hello.desktop 文件根本不会出现在 Dash 中;它只是说“没有结果”。在我输入“hello”或“hello.desktop”之后。
  • 啊,我认为问题在于,一旦 Python 脚本完成,窗口就会消失。您必须在末尾添加input('Press any key to continue'),或者让 .desktop 文件运行一个 shell 脚本,该脚本随后运行 bash 以保持窗口打开。我将正确修改此答案并接受它,以便您获得赏金。谢谢!
【解决方案2】:

关于你的最后一段:

有没有办法通过在 Dash 中输入 Python 脚本的名称来运行它?还是有另一种简单的方法来运行任意 Python 脚本?本质上,我想要的是类似于按下 Win-R 时出现的 Windows 运行对话框,它可以运行系统 PATH 上的任何程序。

你几乎要自己回答了。在 Linux 中,您还有一个 PATH 环境变量。您可以在控制台中输入:

$ echo $PATH

我在/home/xbello/.bashrc 文件中将路径编辑为如下内容:

export PATH=$HOME/bin:$PATH

现在我将我的程序和脚本放在 /home/xbello/bin 中,将它们 chmod 为 +x,它们总是可以从终端或 Alt+F2 获得。如果添加 shebang #!/bin/env python,则不需要扩展名。问题是从 Alt+F2 执行的 print("Hello world") 的输出将会丢失。你需要一些这样的代码:

#!/bin/env python3
import os

os.system("notify-send 'Hello world'")

【讨论】:

  • 是的,但这是从终端窗口运行它们,而不是从 Dash 运行它们。或者在 Alt-F2 的情况下,它运行脚本而不打开终端窗口来显示输出。我正在寻找一个一站式解决方案。
  • 你可以打开一个终端,例如os.system("terminal -e 'echo Hello world; sleep 2'"),将terminal 更改为您的首选终端(gnome-terminal、lxterminal 等)。这样做的好处是您可以从终端、Alt+F2 和 Dash 获得命令。
【解决方案3】:

我想首先指出我不是 Lnx UI 专家(这不是我的主要环境,而且我主要在没有 X)。但我想这从我的评论中很明显。所以我不得不谷歌。一些资源:

  1. [FreeDesktop.Specifications]: Desktop Entry Specification
  2. [Lifewire]: The Complete Guide to the Ubuntu Unity Dash
  3. [AskUbuntu]: Creating a .desktop file for a new application
  4. [GNOME.Developer]: Desktop files: putting your application in the desktop menus(也被[SO]: How can I run a Python script from Ubuntu Dash? (@Bengerman's answer)指出)
  5. 许多其他人

解决方案类似于@Bengerman 的(这是正常的,因为.desktop 文件是自定义Dash 的最常见方式)。
人们可以把它看作是:

  • 巧妙的把戏
  • 蹩脚的解决方法 (gainarie)

我也在两者之间摇摆不定,但考虑到 Dash 可能不是为这种方式设计的,我有点倾向于后者。

1。设置(系统信息)

我有一个具有以下规格的 VirtualBox VM

cfati@cfati-ubtu16x64-0:~/bin$ ~/sopr.sh 
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[064bit prompt]> uname -a
Linux cfati-ubtu16x64-0 4.15.0-58-generic #64~16.04.1-Ubuntu SMP Wed Aug 7 14:10:35 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[064bit prompt]> 
[064bit prompt]> cat /etc/lsb-release | grep LTS
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
[064bit prompt]> 
[064bit prompt]> cat /etc/X11/default-display-manager
/usr/sbin/lightdm
[064bit prompt]> 
[064bit prompt]> echo ${PATH}
/home/cfati/bin:/home/cfati/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/cfati/Install/Google/Android_SDK/tools:/home/cfati/Install/Google/Android_SDK/platform-tools:/home/cfati/Install/Google/Android_SDK/ndk-bundle:/home/cfati/Install/Google/Android_SDK/tools:/home/cfati/Install/Google/Android_SDK/platform-tools:/home/cfati/Install/Google/Android_SDK/ndk-bundle
[064bit prompt]> 
[064bit prompt]> ls -l ~/.local/share/applications/py.desktop
-rw-r--r-- 1 cfati cfati 400 aug 30 20:22 /home/cfati/.local/share/applications/py.desktop
[064bit prompt]> 
[064bit prompt]> ls -l
total 4
-rwxrwxr-x 1 cfati cfati 142 aug 30 21:49 hwx.py

所以,它是一个 Ubtu 16 x64,带有 Unity

2。创建 .desktop 应用程序

py.desktop

[Desktop Entry]
Name=Generic Python file
Comment=Run a Python file when typing its name in Dash ...
Exec=bash -c "bash --rcfile <(echo \"/usr/bin/env python3 %F\")"
#Icon will differ on other machines.
Icon=/usr/share/pixmaps/python3.5.xpm
Terminal=true
Type=Application
#I am not fully aware of the following entries implications
Categories=ConsoleOnly;Utility;System;Development;
Keywords=console;python;

将上述文件复制到${HOME}/.local/share/applications(仅对当前用户启用)。

注意事项

  • 当打开 Dash 时,它应该出现在 Applications 下。但是,出现在那里可能需要一些时间。在我编辑的时候,我注意到它有时没有出现(其中很多是因为它的内容无效(我正在学习过程中),但有一些我无法解释)
  • 执行键 - bash
    • Inner:用于启动 Python,当 Python 启动时不退出
      • 启动 Pythonshebang 有两个影响:
        • 将被忽略(对于具有它们的文件)
        • 没有它们的文件也可以使用
    • 外层:用于包裹内层,因为解析器不喜欢重定向操作符

2.1。将 .py 文件与新应用程序关联

在我的 UI 上,我必须:

  • 右键单击.py文件
  • 转到属性 -> 打开方式
  • 从应用程序列表中选择通用 Python 文件(如果不显示,可能需要添加它)
  • 勾选设为默认按钮

3。测试

测试文件位于~/bin(在${PATH}中)。

hwx.py

#!/usr/bin/env python3


import sys
import os

print("Hello World from: [{0:s}]".format(os.path.abspath(__file__)))
input("Press <ENTER>: ")
  • 打开 Dash 并输入文件名

    注意:不知道是我的 VM 上的故障,还是一般情况,但有时我还必须在文件名后面键入一个 SPACE(它在图片中也可见),以便显示选项

  • 从下面显示的选项中选择(单击)文件,将打开一个控制台:

  • 不用说,Python进程退出后,控制台依然存在

与问题无关,但我认为值得一提[SO]: How do I set “default App” for a file extension to an “.exe” on Windows 10 after April 2018 update (@CristiFati's answer)

【讨论】:

    【解决方案4】:

    使用gnome-panel GUI 可能是最简单的方法:

    1. 安装gnome-panel

      $ sudo apt install gnome-panel
      
    2. 启动项目编辑脚本。您需要将.desktop 文件放入~/.local/share/applications/usr/share/applications。请记住,所有系统用户都可以访问/usr/share

      $ gnome-desktop-item-edit --create-new ~/.local/share/applications/Tester.desktop
      

    1. 填写启动器详细信息。

    1. 然后您就可以从启动器访问该图标,并将其移动到桌面或任何您需要的地方。

    1. 如果您需要编辑应用程序,您有两个选择:

      一个。再次运行项目编辑脚本以重新打开 GUI。

      ```shell
      $ gnome-desktop-item-edit ~/.local/share/applications/Tester.desktop
      ```
      

      b.直接以vim 之类的方式打开桌面文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多