LINUX.ORG.RU

Системный вызов «проводника» в Linux

 ,


1

1

Мне нужно в своей программе дать юзеру возможность открыть заданную папку (например, с документацией) в его любимом файловом менеджере.

Таких в линуксе 146 штук:

  • Nautilus
  • Dolphin
  • Thunar
  • PCManFM
  • XFE
  • Konqueror
  • Krusader
  • DoubleCmd
  • Gnome-commander
  • Sunflower
  • Nemo
  • Marlin
  • Worker
  • 4Pane
  • emelFM2

Мне что, весь список перебирать командой

`which %cmd%`
пока не найду непустой возврат,
или всё-таки есть единый СИСТЕМНЫЙ ВЫЗОВ файлового менеджера установленного по умолчанию?

★★★★

Какой-нибудь xdg-open тутПутьКДиректории не пойдет?

alozovskoy ★★★★★ ()
Последнее исправление: alozovskoy (всего исправлений: 1)

системный вызов

юзерспейсной гуиприблуды

Квалификация налицо.

Deleted ()

а при чем тут

bash, cpp, python, ruby

?

Dred ★★★★★ ()

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

Turbid ★★★★★ ()
Последнее исправление: Turbid (всего исправлений: 2)

cpp,python,ruby

Нафига тут эти теги? По теме: xdg-open

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 1)

Должна быть переменная окружения, которая содержит имя дефолтного ФМ.

l4gfcm ()

С наскоку не нагуглил, но могу дать подсказку: распакуй пакет любого ФМ и смотри установочный скрипт на наличие установки переменных окружения. Не забудт с нами поделиться.

l4gfcm ()

Открыть для чего? Потом же что-то нужно в программу вернуть, да? Тогда тут не файловый менеджер нужен, а диалог открытия файлов или как там оно называется в вашем тулките.

hotpil ★★★ ()
Ответ на: комментарий от l4gfcm

Да нет такой переменной окружения. Оно где-то внутри хомяка хранится, причём у разных DE по-разному.

Я например в качестве файлового менеджера использую zsh и mc. Из них файловым менеджером является только второй, но это не решение по умолчанию, а «вторичный», так сказать. А из перечисленного у меня ничего не установлено.

Файловый менеджер по умолчанию зависит от DE. Для определения оного есть готовое решение — xdg-open. Но использовать это надо с осторожностью, потому что далеко не у всех пользователей есть DE и графический ФМ.

P. S. запустил сейчас xdg-open ~, он мне открыл почему-то EasyTag 😁

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от Psych218

Ссылайся в программе на свою переменную, заставь хомяка её у себя выставить или в установочном скрипте проверку и установку запили.

l4gfcm ()

bash, cpp, python, ruby

А почему не java, erlang или visual basic for applications?

theNamelessOne ★★★★★ ()
Ответ на: комментарий от l4gfcm

Ссылайся в программе на свою переменную, заставь хомяка её у себя выставить или в установочном скрипте проверку и установку запили.

Ты точно мне хотел ответить? У меня нет никакой переменной (и ни у кого нет, есть конфиги только). У меня есть xdg-open, который делает как раз то, что нужно ТС.

Psych218 ★★★★★ ()
Ответ на: комментарий от alozovskoy

Блин! У меня оказывается этот ваш xdg-open уже используется в коде - правда, для открытия браузера!

Чтож, буду знать, что он и «проводник» открывает.

За сим тему считаю исчерпанной.

Novator ★★★★ ()
Ответ на: комментарий от Psych218

Нафига тут эти теги?

Чтоб побольше кулхакеров набежало и меня научило же!
И оно это сделало-таки!

Novator ★★★★ ()
Ответ на: комментарий от hotpil

Открыть для чего? Потом же что-то нужно в программу вернуть, да?

Нет, в программу ничо не нужно - просто открыть.
А диалоги выбора файла/папки я знаю как в Gtk2 юзать.

Novator ★★★★ ()
Ответ на: комментарий от l4gfcm

Не забудт с нами поделиться.

Оказывается, у меня уже всё есть в проге:

  # Open web browser or email client
  # RU: Открывает веб-браузер или email клиент
  def self.go_web_link(link)
    a1 = 'xdg-open'
    a2 = ' &'
    if PandoraUtils.os_family=='windows'
      a1 = 'start'
      a2 = ''
    end
    system(a1 + ' ' + link + a2)
  end
Novator ★★★★ ()
Ответ на: комментарий от Novator

Он открывает в принципе все. Вызывает нужную программу.

Как виндовый open.

a1batross ★★★★★ ()
Ответ на: комментарий от Dred

Конечно же чтобы собрать специалистов каждого звена ничего в этом не смыслящих.

kachan ★★ ()
Последнее исправление: kachan (всего исправлений: 1)
Ответ на: комментарий от Novator

system(a1 + ' ' + link + a2)

Не знаю, как там в руби этот system реализован, но вообще-то не принято вот так строки складывать весело. Несекурно это.

А если в link будет ; rm -rf /*?

Psych218 ★★★★★ ()
Ответ на: комментарий от Psych218

Та какая разница, валидация параметров для слабаков.

kachan ★★ ()
Ответ на: комментарий от l4gfcm

Встречайте! Супер-мега-блокбастер-метод-открывающий-всё-и-вся:

  # Add quotes if string has spaces
  # RU: Добавляет кавычки если строка содержит пробелы
  def self.add_quotes(str, qts='"')
    if (str.is_a? String) and str.index(' ')
      str = qts+str+qts
    end
    str
  end

  # Open link in web browser, email client or file manager
  # RU: Открывает ссылку в браузере, почтовике или проводнике
  def self.external_open(link)
    cmd = 'xdg-open'
    tail = ' &'
    if PandoraUtils.os_family=='windows'
      cmd = 'start'
      tail = ''
    end
    system(cmd + ' ' + PandoraUtils.add_quotes(link) + tail)
  end
Novator ★★★★ ()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Psych218

А если в link будет ; rm -rf /*?

Достаточно вызывать команду не как system(cmd + ' ' + arg + ' ' + arg2 + ...), а как system(cmd, arg, arg2, ...).

Novator.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от Novator

Встречайте! Супер-мега-блокбастер-метод-открывающий-всё-и-вся:

facepalm

def self.add_quotes(str, qts='"')

Изучи документацию по использовуемому языку и библиотекам и не городи наикривейших велосипедов. Твой костыль сфейлится на sleep" 0; rm -rf /* & sleep "0. Используй нормальные готовые решения.

Psych218 ★★★★★ ()
Последнее исправление: Psych218 (всего исправлений: 3)
Ответ на: комментарий от theNamelessOne

В руби так можно, ничего себе. В python, C, php и прочих system принимает строку.

pawnhearts ★★★★ ()
Ответ на: комментарий от pawnhearts

В python subprocess.Popen принимает список аргументов. Или вы не про это?

MLP_Fan ★★ ()
Ответ на: комментарий от pawnhearts

При том, что в ruby system - обвязка над posix.system(), а в других языках - вызов самого posix.system(). Странно их сравнивать.

MLP_Fan ★★ ()
Ответ на: комментарий от MLP_Fan

Что довольно неочевидно для человека, знакомого с posix/C. В питоне все эти вызовы типа os.exec* os.spawn* popen* system и прочие максимально близки к сишечке.

pawnhearts ★★★★ ()
Ответ на: комментарий от pawnhearts

Не думаю что хорошей идеей будет после C продолжать использовать эти вызовы напрямую и в питоне. А если надо что-нибудь специфическое то лучше не делать из питона С, а написать себе модуль на С с нужными функциями и подключить его в питон.

MLP_Fan ★★ ()
Ответ на: комментарий от alozovskoy

Какой-нибудь xdg-open тутПутьКДиректории не пойдет?

Видимо, пойдёт, у меня в кедах по нему konqueror вызывается.

Другое дело, что если ТС хочет не просто в умолчальном, а «в его любимом», возможно, стоит дополнительно предусмотреть в программе пользовательскую настройку на этот счёт.

hobbit ★★★★★ ()
Ответ на: комментарий от MLP_Fan

В питоне полно более высокоуровневых обвязок даже в стандартной библиотеке, те же pathlib, subprocess и прочее. Но тот же модуль posix с вызовами близкими к си снижает порог вхождения для людей уже знакомых с ними, что большой плюс для скриптового языка.

pawnhearts ★★★★ ()
Ответ на: комментарий от pawnhearts

в этом я согласен с вами. Питон многогранен и подходит почти для любой задачи.

MLP_Fan ★★ ()

У меня, кстати, подобный перебор был в одном проекте и ничего. Но там также была настройка через конфиг и GUI, просто таким образом оно выбирало вариант по-умолчанию при первом запуске. Хотел показать код, но github у меня не открывается, такие дела.

pawnhearts ★★★★ ()
Ответ на: комментарий от Psych218

sleep" 0; rm -rf /* & sleep «0

Вот уже ответили же: ))

Та какая разница, валидация параметров для слабаков.

На самом деле вопрос серьёзный, но я подумаю о нём как-нибудь попозже.

Novator ★★★★ ()
Ответ на: комментарий от theNamelessOne

system(cmd, arg, arg2, ...)

Я изначально так и делал, но оно кажись в винде не работало.
Или ещё какая-то хрень (уж не помню), короче пришлось делать как сделано.

Novator ★★★★ ()
Последнее исправление: Novator (всего исправлений: 1)
Ответ на: комментарий от Novator

А попробуй заменить system(...) на pid = Process.spawn(...); Process.detach(pid). Так, например, можно избавиться от амперсанда в команде для Linux.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)

Ты хотя бы знаешь, что означает словосочетание «системный вызов»? А?

intelfx ★★★★★ ()
Ответ на: комментарий от pawnhearts

Потому что если в голове каша, то и в коде тоже будет каша. А это плохо.

И прекращаем переходить на личности, тем более что указанные личности не имеют ко мне никакого отношения.

intelfx ★★★★★ ()
Ответ на: комментарий от theNamelessOne

Запилил такую хрень:

  # Open link in web browser, email client or file manager
  # RU: Открывает ссылку в браузере, почтовике или проводнике
  def self.external_open(link)
    cmd = 'xdg-open'
    cmd = 'start' if PandoraUtils.os_family=='windows'
    pid = Process.spawn(cmd, link)
    Process.detach(pid) if pid
  end
Под линухом работает, под виндой надо проверять.
Но должно, ибо аналогичное в моём другом скрипте робит.

Novator ★★★★ ()
Ответ на: комментарий от intelfx

Ты хотя бы знаешь, что означает словосочетание «системный вызов»? А?

Да, знаю - это обращение к системной библиотеке.
А теперь иди мусор выбрось и - сразу за уроки!

Novator ★★★★ ()
Ответ на: комментарий от intelfx

Тебе что, «теоретик», заголовок не понравился?
Можешь более очевидный предложить? Давай, дерзни.

Novator ★★★★ ()
Последнее исправление: Novator (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.