Чередование команд Shell и Python в Jupyter в одной строке

Как я могу чередовать цепочку команд python и оболочки в одной строке? Есть ли способ встроить магию в выражение Python?

Например:

var = !date +%s <<command to stop magic execution>> [0]

Как я это делаю сейчас:

var = !date +%s
var = var[0]

Есть ли веская причина использовать расширения Jupyter, а не собственный синтаксис Python (например, вызов на основе subprocess)?

Charles Duffy 07.01.2019 13:50

Кстати, для конкретного примера date -s вам вообще не нужна оболочка - Python сам может дать вам UNIX-время в секундах. var = time.time() (после import time), и все готово (возможно, приведение к int, если вам нужно только целое число, а не значение с плавающей запятой).

Charles Duffy 07.01.2019 13:51

При использовании ! (или другой магии) вся остальная часть строки обрабатывается магией, то есть строки передаются магии. Итак, нет, нет способа отметить конец команды и начало обработки Python. То, что вы делаете сейчас, - правильный путь; не борись с этим!

hpaulj 07.01.2019 19:28

@CharlesDuffy, нет, нет веской причины, кроме того факта, что это улучшает читаемость. Опять же, команда date была просто примером.

denisb411 07.01.2019 19:34

@hpaulj Вы уверены, что нет никакого способа остановить выполнение "волшебных команд Jupyter" вместо использования другой строки? Есть какой-нибудь документ, показывающий это? Если это правда, я думаю, что мы можем закрыть это, потому что я не пытаюсь найти другие способы.

denisb411 07.01.2019 19:36

Другой способ задать вопрос - есть ли способ встроить магию в выражение Python?

hpaulj 07.01.2019 20:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
48
1

Ответы 1

Эквивалент, который работает во всех интерпретаторах Python, независимо от того, активен ли Jupyter, будет:

import subprocess
def shell(args):
    return subprocess.Popen(args, stdout=subprocess.PIPE, shell=True).communicate()[0].split('\n')

var = shell('date +%s')[0]

... при этом, для конкретного случая использования он вам не нужен:

import time
var = str(int(time.time()))

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

Я ценю ваш путь вперед, но мне нужен способ Jupyter.

denisb411 07.01.2019 14:32

Кроме того, сценарий свидания был просто примером. Спасибо, в любом случае.

denisb411 07.01.2019 14:32

Вы предполагаете, что есть является способ сделать это Jupyter. Это необоснованное предположение: «магия» Jupyter действует либо на целую строку, либо на целую ячейку; он не встраивается в уровень AST языка, поэтому не может заменить произвольные подвыражения.

Charles Duffy 07.01.2019 15:43

Да, я предполагал это. Если нет никакого способа остановить магическую операцию, я думаю, мы можем закрыть это. Вы можете доказать, что это невозможно?

denisb411 07.01.2019 19:38

Я исследовал, что происходит с out = !... в: stackoverflow.com/questions/53908761/…. На самом деле это магия %sx, которую вы можете изучить с помощью %sx??.

hpaulj 07.01.2019 21:29

Другие вопросы по теме