2013-04-16 2 views
2

Есть ли способ вызвать скрипт оболочки и использовать функции/переменную, определенные в скрипте из python?Как вызвать функцию/переменную скрипта оболочки из python?

Сценарий unix_shell.sh

#!/bin/bash 
function foo 
{ 
... 
} 

Можно ли назвать эту функцию Foo из питона?

Решение:

  1. Для функций: Преобразование функции Shell в питон функции
  2. Для оболочки локальных переменных (неэкспортированный), запустите эту команду в оболочке, просто перед вызовом питона сценария:
    экспорта $ (набор | тр '\ п' ' «)

  3. Для оболочки глобальных переменных (экспортируемых из оболочки), в Python, вы можете: импорт ОС печать os.environ [ "VAR1"]

+0

Посмотрите на модуль 'subprocess'. Это может помочь. –

ответ

1

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

Но это не действительно , вызывающий Функция. Это все еще выполняет bash с параметрами и возвращает строку на stdio.

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

2

Да, аналогично тому, как вы могли бы назвать его из другого Баш скрипт:

import subprocess 
subprocess.check_output(['bash', '-c', 'source unix_shell.sh && foo']) 
+0

Это не вызов функции. Это выполняет bash. –

+0

@LennartRegebro: Я не вижу, как вы могли бы ожидать выполнения функции bash без выполнения bash на каком-то уровне ... – Eric

+0

Это просто означает, что вопрос не имеет особого смысла в первую очередь.Запуск подпроцесса с параметрами командной строки действительно не квалифицируется как вызов функции, даже если эта функция выполняется. И даже если вы считаете, что это соответствует требованиям, это вряд ли будет лучшим решением. –

0

Я не знаю много о питоне, но если Вы используете export -f foo после определения функции сценария оболочки, то если вы запустите sub bash, функцию можно вызвать. Без export, вам нужно запустить сценарий оболочки, как . script.sh внутри sub bash, запущенного в python, но он будет запускать все в нем и будет определять все функции и все переменные.

0

Вы можете разделить каждую функцию в свой собственный файл bash. Затем используйте Python для передачи правильных параметров в каждый отдельный файл bash.

Это может быть проще, чем просто переписать функции bash в Python самостоятельно.

Вы можете вызывать эти функции с помощью

import subprocess 
subprocess.call(['bash', 'function1.sh']) 
subprocess.call(['bash', 'function2.sh']) 
# etc. etc. 

Вы можете использовать подпроцесс для передачи параметров тоже.

Смежные вопросы