Кажется, ошибка в 0.14, особенно со строками (работает, например, с помощью ints). Я здесь указал: https://github.com/pydata/pandas/issues/7300 . В качестве обходного пути вы можете обернуть его в список:
In [40]: fills
Out[40]:
Price Symbol
0 109.70 BUD US
1 109.72 BUD US
2 183.30 IBM US
3 183.35 IBM US
In [41]: my_symbol = ['BUD US']
In [42]: fills.query('Symbol==@my_symbol')
Out[42]:
Price Symbol
0 109.70 BUD US
1 109.72 BUD US
Кажется, что самый простой способ решить вашу реальную проблему - это изменить привязку i3 на
bindsym --release $mod+Shift+t exec /usr/local/bin/myscript fromI3
и сделать
if [[ -n "$1" ]]; then
echo "this was from a keybind"
else
echo "this wasn't from a keybind"
fi
в вашем скрипте.
Как подсказывает большинство результатов в Google, вы могли бы использовать tty
, который обычно возвращает «не tty» , когда он не запущен в терминале. Однако, похоже, что это отличается от сценариев, вызываемых через bindsym exec
в i3 / Sway:
/dev/tty1 # From a keybind
/dev/pts/6 # In a terminal
/dev/tty2 # In a console
Хотя tty | grep pts
частично отвечает на вопрос, он не может различить запуск в консоли против привязки клавиш, которая вам не нужна, если вы пытаетесь показать графический интерфейс.
Кажется, что при запуске с помощью привязки клавиш родительский процесс всегда имеет systemd
. Имея это в виду, что-то вроде этого может работать:
{
[ "$PPID" = "1" ] && echo "keybind" || echo "terminal"
} > /tmp/detect.log
Вероятно, безопасное предположение, что процесс systemd
всегда будет иметь 1
в качестве PID, но есть нет никакой гарантии, что в каждой системе, использующей i3, также будет использоваться systemd, поэтому этого лучше всего избегать.
Более надежный способ - использовать ps
. Согласно PROCESS STATE CODES
на странице руководства:
Для форматов BSD и при использовании ключевого слова stat могут отображаться дополнительные символы:
blockquote>< high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group
здесь ключ
+
в последней строке. Чтобы проверить это в терминале, вы можете вызватьps -Sp <PID>
, который будет иметь значениеSTAT
, равноеSs
, при работе «в интерактивном режиме», илиS+
, если он запускается с помощью связывания клавиш.Так как вам нужен только столбец
STATE
, вы можете дополнительно очистить его с помощью-o stat=
, который также удалит заголовки, а затем пропустите через grep, чтобы получить следующее:is_interactive() { ps -o stat= -p $ | grep -q '+' } if is_interactive; then read -rp "Enter your username: " username else username=$(yad --entry --text "Enter your username:") fi
Это будет работать не только в эмуляторе терминала и через связывание клавиш i3 / Sway, но даже в необработанном окне консоли, что делает его гораздо более надежным вариантом, чем
tty
выше.