WedX - журнал о программировании и компьютерных науках

Как выполнить скрипт bash из строки Python в блокноте Jupyter?

Я использую Jupyter Notebook и хотел бы выполнить скрипт bash из строки python. У меня есть ячейка python, создающая скрипт bash, который затем мне нужно распечатать, скопировать в другую ячейку, а затем запустить. Можно ли использовать что-то вроде exec('print('hello world!')')?

Вот пример моего bash-скрипта:

%%bash -s "$folder_dir" "$name_0" "$name_1" "$name_2" "$name_3" "$name_4" "$name_5" "$name_6" "$name_7" "$name_8" "$name_9" "$name_10" "$name_11"

cd $1

ds9 ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9} ${10} ${11} ${12} ${13}

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

ds9 dir1 dir2 dir3 ...

в моем блокноте Jupyter, так как я могу инициализировать каталоги только с помощью python. Обратите внимание, что количество каталогов не фиксируется каждый раз, когда я запускаю свой код. ds9 — это просто команда для одновременного открытия нескольких астрономических изображений.

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


  • Может быть, вы ищете что-то здесь? 02.02.2017
  • ${2} не дает вам абсолютно никакого преимущества в правильности по сравнению с $2, если только вы не выполняете конкатенацию строк, тогда как "$2" фактически гарантирует, что ваш второй аргумент передается как одна строка, а не потенциально разделяется или объединяется в несколько аргументов или передается без аргументов. вообще (если он не содержит символов, которых нет в IFS). 02.02.2017

Ответы:


1

Модуль subprocess подходит для вызова внешнего программного обеспечения — в оболочке. или иначе -- из Python.

import subprocess

folder_dir="/" # your directory
names=["name_one", "name_two"]   # this is your list of names you want to open

subprocess.check_call(
    ['cd "$1" || exit; shift; exec ds9 "$@"', "_", folder_dir] + names,
    shell=True)

Как это работает (Питон)

При передаче списка Python с помощью shell=True первым элементом в этом списке является запускаемый скрипт; второй — это значение $0, когда этот скрипт запущен, а последующие элементы — это значения для $1 и далее.

Обратите внимание, что это запускает sh -c '...' с вашей командой. sh - это не bash, а (в современных системах) интерпретатор POSIX sh. Таким образом, важно не использовать синтаксис только для bash в этом контексте.

Как это работает (Шелл)

Давайте рассмотрим это построчно:

cd "$1" || exit # try to cd to the directory passed as $1; abort if that fails
shift           # remove $1 from our argument list; the old $2 is now $1, &c.
exec ds9 "$@"   # replace the shell in memory with the "ds9" program (as an efficiency
                # ...measure), with our argument list appended to it.

Обратите внимание, что "$1" и "$@" заключены в кавычки. Любое расширение без кавычек будет разбито на строки и развернуто по шаблону; без этого изменения вы не сможете открывать файлы с пробелами в именах.

01.02.2017
  • Ха! Это сработало! Большое спасибо! Мой код теперь на 75% короче. Я знал об этом пакете, но не знал, что его можно использовать вот так. 02.02.2017
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

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

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]