Чтение значений из именованной таблицы каталогов zsh из Python - PullRequest
0 голосов
/ 07 мая 2020

Для экземпляра zsh, имеющего запись my_private_dir в названной таблице каталогов, а экземпляр zsh используется для запуска сценария Python. Как мог Python прочитать значение my_private_dir?

Например

$ hash -d my_private_dir=/media/user/encrypted_dir
$ hash -d | grep my_private_dir | sed 's/.*=//'
/media/user/encrypted_dir
$ python
>>> get_zsh_named_dir('my_private_dir') # How could python read it?

Я пробовал system.os. Но это не работает, чего и следовало ожидать, поскольку он запускает новый экземпляр оболочки. Это новый процесс, который может не иметь такой же именованной таблицы каталогов.

# Continuing from the previous code snippet
>>> import os
>>> os.system("echo $SHELL")
/bin/zsh
0
>>> os.system("hash -d | grep my_private_dir | sed 's/.*=//'")
0

Итак, как Python мог читать данные из родительской zsh таблицы ha sh?

1 Ответ

0 голосов
/ 07 мая 2020

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

. Вы можете сделать это, прочитав данные в Python как скрипт и запустив Python с -i чтобы сделать его впоследствии интерактивным.

Чтобы передать ввод в сценарий, в то же время позволяя Python стать интерактивным, ввод не может быть задан как стандартный ввод. Но, к счастью, zsh (и bash) имеют способ перенаправить вывод команды, как если бы это был файл, а Python имеет простой способ читать ввод из файлов.

Вот сценарий: он считывает пары ключ / значение, разделенные равенством , из файлов и / или стандартный ввод в словарь с именем eqdict.

"""eqdict.py

Translate equals-separated key/value lines into a Python dict.
"""
try:
    import fileinput
    eqdict = {}
    for line in fileinput.input():
        key, val = line.rstrip().split('=', 1)
        eqdict[key] = val
finally:
    # Don't pollute the global namespace
    del fileinput, line, key, val

И вот как вы можете его использовать:

zsh% hash -d some_name=./some_dir/
zsh% python3 -i eqdict.py <(hash -d)
>>> eqdict['some_name']
'./some_dir/'
...