Как мне запустить скрипт Python из Ubuntu Dash?

Я написал hello.py (базовая программа "hello world") и хотел бы иметь возможность быстро запустить ее на моем компьютере с Ubuntu, нажав клавишу Win, чтобы открыть Dash, затем введите имя сценария (или что-то подобное к этому).

Однако, когда я набираю hello.py в Dash, он открывает файл в редакторе, а не выполняет его. Я добавил строку shebang #!/usr/bin/env python3 и запустил chmod u+x hello.py, он все равно открывает файл в редакторе.

Я попытался создать сценарий оболочки hello.sh, который будет запускать сценарий Python, но сценарий оболочки также открывается в редакторе при вводе его имени в Dash.

Кроме того, я попытался нажать Alt-F2, и он вызывает что-то вроде Windows-Win-R, но когда я вхожу в python3 hello.py, он не вызывает окно терминала для отображения какого-либо вывода print().

Есть ли способ запустить скрипт Python, введя его имя в Dash? Или есть другой простой способ запустить произвольный скрипт на Python? По сути, мне нужно что-то вроде диалогового окна "Запуск Windows", которое появляется при нажатии Win-R, которое может запускать любую программу в системном PATH.

Ответы

Ответ 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 имеет действительный шебанг
  • путь должен быть абсолютным (то есть не относительным, а также не использующим расширения оболочки, такие как ~ или переменные)

Ответ 2

Я хочу начать с указания, что я не эксперт по Lnx UI (это не моя основная среда, и я в основном работаю без X). Но я думаю, это было очевидно из моего комментария. Так что мне пришлось гуглить. Некоторые ресурсы:

  1. [FreeDesktop.Specifications]: спецификация входа на рабочий стол
  2. [Lifewire]: Полное руководство по Ubuntu Unity Dash
  3. [AskUbuntu]: создание файла .desktop для нового приложения
  4. [GNOME.Developer]: файлы рабочего стола: размещение приложения в меню рабочего стола (на что также указывает [SO]: как запустить скрипт Python из Ubuntu Dash? (Ответ @Bengerman))
  5. Многие другие

Решение аналогично @Bengerman (что является нормальным, поскольку файлы .desktop являются наиболее распространенным способом настройки Dash).
Люди могут смотреть на это так, как если бы это было:

  • Опрятный трюк
  • Хромой обходной путь (Gainarie)

Я тоже колеблюсь между двумя, но учитывая тот факт, что Dash, вероятно, не предназначен для такой работы, я склоняюсь к последнему.

1. Настройка (информация о системе)

У меня есть виртуальная машина VirtualBox со следующими характеристиками:

[email protected]:~/bin$ ~/sopr.sh 
*** Set shorter prompt to better fit when pasted in Qaru (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 он должен появиться в разделе "Приложения". Однако это может занять некоторое время. Во время редактирования я заметил, что иногда он не отображался (многие из них были из-за того, что его содержимое было недействительным (я участвовал в процессе обучения), но некоторые из них я не мог объяснить)
  • Exec key - bash:
    • Внутренний: используется для запуска Python и не выходить из, когда Python делает
      • Запуск Python имеет 2 значения в отношении shebangs:
        • Будет игнорироваться (для файлов, у которых они есть)
        • Файлы, у которых их нет, также будут работать
    • Наружный: используется для переноса внутреннего, так как парсер не любит оператор перенаправления

2.1. Свяжите файлы .py с новым приложением

В моем интерфейсе я должен был:

  • Щелкните правой кнопкой мыши файл .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 и введите имя файла

    Img0

    Примечание: не знаю, является ли это сбой на моей виртуальной машине, или это что-то общее, но иногда мне нужно также ввести пробел после имени файла (оно также видно на рисунке), чтобы варианты отображались

  • Выберите (щелкните) файл из представленных ниже вариантов, и откроется консоль:

    Img1

  • Само собой разумеется, что после завершения процесса Python консоль останется

Не имеет отношения к вопросу, но я думаю, что стоит упомянуть [SO]: как установить "приложение по умолчанию" для расширения файла на ".exe" в Windows 10 после обновления апреля 2018 года  (Ответ @CristiFati).

Ответ 3

Относительно вашего последнего абзаца:

Есть ли способ запустить скрипт Python, введя его имя в Dash? Или есть другой простой способ запустить произвольный скрипт на Python? По сути, мне нужно что-то вроде диалогового окна запуска Windows, которое появляется при нажатии Win-R, которое может запускать любую программу в системном PATH.

Ты почти отвечаешь сам. В Linux у вас также есть переменная окружения PATH. Вы можете проверить это в консоли, набрав:

$ echo $PATH

Мой путь отредактирован в моем файле /home/xbello/.bashrc примерно так:

export PATH=$HOME/bin:$PATH

Теперь я помещаю свои программы и скрипты в /home/xbello/bin, chmod их в +x, и они всегда доступны из терминала или Alt + F2. Вам не нужно расширение, если вы добавите шебанг #!/bin/env python. Проблема в том, что вывод print("Hello world"), выполненного из Alt + F2, будет потерян. Вам нужен код, подобный следующему:

#!/bin/env python3
import os

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

Ответ 4

Использование GUI gnome-panel, вероятно, самый простой способ:

  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
    

enter image description here

  1. Заполните данные программы запуска.

enter image description here

  1. После этого вы получите доступ к значку из панели запуска и сможете переместить его на рабочий стол или в любое удобное для вас место.

enter image description here

  1. Если вам когда-либо понадобится редактировать приложение, у вас есть 2 варианта:

    а. Снова запустите сценарий редактирования элемента, чтобы снова открыть графический интерфейс.

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

    б. Откройте файл Desktop прямо в чем-то вроде vim.

enter image description here