Выполнить python script с помощью функции из командной строки, Linux

У меня есть мой файл python, называемый convertImage.py, и внутри файла у меня есть script, который преобразует изображение по своему вкусу, вся конвертация script устанавливается внутри функции, называемой convertFile (fileName)

Теперь моя проблема в том, что мне нужно выполнить этот python script из командной строки linux, передав вместе с ним функцию convertFile (fileName).

Пример:

 linux user$: python convertImage.py convertFile(fileName)

Это должно выполнить python script, передав соответствующую функцию.

Пример:

def convertFile(fileName):

    import os, sys
    import Image
    import string

    splitName = string.split(fileName, "_")
    endName = splitName[2]
    splitTwo = string.split(endName, ".")
    userFolder = splitTwo[0]

    imageFile = "/var/www/uploads/tmp/"+fileName

    ...rest of the script...

    return

Каков правильный способ выполнить этот python script и правильно передать имя файла функции из командной строки liunx?

Спасибо в расширенном

Ответ 1

Это

if __name__ == "__main__":
    command= " ".join( sys.argv[1:] )
    eval( command )

Это сработает. Но это безумно опасно.

Вам действительно нужно подумать о том, что такое синтаксис командной строки. И вам нужно подумать о том, почему вы нарушаете давно установленные стандарты Linux для указания аргументов в программе.

Например, вам следует рассмотреть возможность удаления бесполезного () в вашем примере. Вместо этого сделайте это.

python convertImage.py convertFile fileName

Затем вы можете - при небольшой работе - использовать argparse для получения команды ( "convertFile" ) и аргументов ( "имя_файла" ) и работать в стандартном синтаксисе командной строки Linux.

function_map = { 
    'convertFile': convertFile,
    'conv': convertFile,
}
parser = argparse.ArgumentParser()
parser.add_argument( 'command', nargs=1 )
parser.add_argument( 'fileName', nargs='+' )
args= parser.parse_args()
function = function_map[args.command]
function( args.fileName )

Ответ 2

Быстрый и грязный способ:

linux user$: python convertImage.py convertFile fileName

а затем в convertImage.py

if __name__ == '__main__':
    import sys
    function = getattr(sys.modules[__name__], sys.argv[1])
    filename = sys.argv[2]
    function(filename)

Более сложный подход будет использовать argparse (для 2.7 или 3.2+) или optparse.

Ответ 3

Создайте исполняемую часть верхнего уровня вашего script, которая анализирует аргументы командной строки, а затем передает ее в вашу функцию в вызове, например:

import os, sys
#import Image
import string


def convertFile(fileName):
    splitName = string.split(fileName, "_")
    endName = splitName[2]
    splitTwo = string.split(endName, ".")
    userFolder = splitTwo[0]

    imageFile = "/var/www/uploads/tmp/"+fileName

    print imageFile     # (rest of the script)

    return


if __name__ == '__main__':
    filename = sys.argv[1]
    convertFile(filename)

Тогда из оболочки

$ convertImage.py the_image_file.png
/var/www/uploads/tmp/the_image_file.png