Как я могу чередовать цепочку команд python и оболочки в одной строке? Есть ли способ встроить магию в выражение Python?
Например:
var = !date +%s <<command to stop magic execution>> [0]
Как я это делаю сейчас:
var = !date +%s
var = var[0]
Кстати, для конкретного примера date -s вам вообще не нужна оболочка - Python сам может дать вам UNIX-время в секундах. var = time.time() (после import time), и все готово (возможно, приведение к int, если вам нужно только целое число, а не значение с плавающей запятой).
При использовании ! (или другой магии) вся остальная часть строки обрабатывается магией, то есть строки передаются магии. Итак, нет, нет способа отметить конец команды и начало обработки Python. То, что вы делаете сейчас, - правильный путь; не борись с этим!
@CharlesDuffy, нет, нет веской причины, кроме того факта, что это улучшает читаемость. Опять же, команда date была просто примером.
@hpaulj Вы уверены, что нет никакого способа остановить выполнение "волшебных команд Jupyter" вместо использования другой строки? Есть какой-нибудь документ, показывающий это? Если это правда, я думаю, что мы можем закрыть это, потому что я не пытаюсь найти другие способы.
Другой способ задать вопрос - есть ли способ встроить магию в выражение Python?






Эквивалент, который работает во всех интерпретаторах 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.
Кроме того, сценарий свидания был просто примером. Спасибо, в любом случае.
Вы предполагаете, что есть является способ сделать это Jupyter. Это необоснованное предположение: «магия» Jupyter действует либо на целую строку, либо на целую ячейку; он не встраивается в уровень AST языка, поэтому не может заменить произвольные подвыражения.
Да, я предполагал это. Если нет никакого способа остановить магическую операцию, я думаю, мы можем закрыть это. Вы можете доказать, что это невозможно?
Я исследовал, что происходит с out = !... в: stackoverflow.com/questions/53908761/…. На самом деле это магия %sx, которую вы можете изучить с помощью %sx??.
Есть ли веская причина использовать расширения Jupyter, а не собственный синтаксис Python (например, вызов на основе
subprocess)?