Выполнить 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