Как мне запустить скрипт 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). Но я думаю, это было очевидно из моего комментария. Так что мне пришлось гуглить. Некоторые ресурсы:
- [FreeDesktop.Specifications]: спецификация входа на рабочий стол
- [Lifewire]: Полное руководство по Ubuntu Unity Dash
- [AskUbuntu]: создание файла .desktop для нового приложения
- [GNOME.Developer]: файлы рабочего стола: размещение приложения в меню рабочего стола (на что также указывает [SO]: как запустить скрипт Python из Ubuntu Dash? (Ответ @Bengerman))
- Многие другие
Решение аналогично @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 и введите имя файла
Примечание: не знаю, является ли это сбой на моей виртуальной машине, или это что-то общее, но иногда мне нужно также ввести пробел после имени файла (оно также видно на рисунке), чтобы варианты отображались
Выберите (щелкните) файл из представленных ниже вариантов, и откроется консоль:
Само собой разумеется, что после завершения процесса 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
, вероятно, самый простой способ:
Установите gnome-panel
.
$ sudo apt install gnome-panel
Запустите скрипт редактирования элемента. Вам нужно поместить файл .desktop
либо в ~/.local/share/applications
, либо в /usr/share/applications
. Помните, что /usr/share
будет доступен для всех пользователей системы.
$ gnome-desktop-item-edit --create-new ~/.local/share/applications/Tester.desktop
- Заполните данные программы запуска.
- После этого вы получите доступ к значку из панели запуска и сможете переместить его на рабочий стол или в любое удобное для вас место.
Если вам когда-либо понадобится редактировать приложение, у вас есть 2 варианта:
а. Снова запустите сценарий редактирования элемента, чтобы снова открыть графический интерфейс.
'''shell
$ gnome-desktop-item-edit ~/.local/share/applications/Tester.desktop
'''
б. Откройте файл Desktop прямо в чем-то вроде vim
.