выполнить скрипт Python с функцией из командной строки, Linux - PullRequest
11 голосов
/ 07 октября 2011

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

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

пример:

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

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

пример:

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 и правильно передать имя файла функции из командной строки liunx?

Спасибо заранее

Ответы [ 3 ]

22 голосов
/ 07 октября 2011

Это

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

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

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

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

python convertImage.py convertFile fileName

Затем вы можете - без особых усилий - использовать argparse для получения команды ("convertFile") и аргументов ("fileName") и работать встандартный синтаксис командной строки 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 )
4 голосов
/ 07 октября 2011

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

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 .

1 голос
/ 07 октября 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...