запустить функцию (из файла .py) из консоли Linux - PullRequest
1 голос
/ 21 ноября 2010

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

У меня есть скрипт на python, который открывает ppm-файл, применяет выбранный фильтр (повороты ...) и создает новую картинку.пока здесь все работает нормально.

но я хочу сделать то же самое через консоль linux, например:

ppmfilter.py ROTD /path/imageIn.ppm /path/imageOut.ppm

здесь ROTD - это имя функции, котораяприменить вращение.

Я не знаю, как это сделать, я ищу библиотеку, которая позволит мне это сделать.

с нетерпением жду вашей помощи.

PS: я использую python 2.7

Ответы [ 4 ]

7 голосов
/ 21 ноября 2010

Существует относительно простой способ:

Вы можете определить глобальные имена (функции, переменные и т. Д.) С помощью 'globals ()'. Это дает вам словарь всех глобальных символов. Вам просто нужно проверить тип (с помощью type () и типов модулей), и если это функция, вы можете вызвать ее с помощью sys.argv:

import types
import sys

def ROTD(infile, outfile):
    # do something

if __name__ == '__main__':
    symbol = globals().get(sys.argv[1])
    if hasattr(symbol, '__call__'):
        symbol(*sys.argv[2:])

Это передаст аргумент программы (исключая имя файла и имя команды) функции.

РЕДАКТИРОВАТЬ: Пожалуйста, не забудьте обработку ошибок. Я пропустил это из соображений ясности.

1 голос
/ 21 ноября 2010

Хороший способ сделать это - определить большой словарь {alias: function} внутри вашего модуля.Например:

actions = {
    'ROTD': ROTD,
    'REFL': reflect_image,
    'INVT': invIm,
}

Вы поняли идею.Затем возьмите первый аргумент командной строки и интерпретируйте его как ключ этого словаря, применяя actions[k] к остальным аргументам.

1 голос
/ 21 ноября 2010

Использовать функцию main ():

def main()
   # call your function here

if __name__ == "__main__":
   main()
0 голосов
/ 21 ноября 2010

Вы можете определить в своем разделе ppmfilter.py main следующее:

if __name__ == "__main__":
  import sys
  ROTD(sys.argv[1], sys.argv[2]) # change according to the signature of the function

и вызвать его: python ppmfilter.py file1 file2

Вы также можете запустить python -c в каталогекоторый содержит ваш * .py файл:

python -c "import ppmfilter; ppmfilter.ROTD('/path/to/file1', '/path/to/file2')"
...