Python - указать, какую функцию в файле использовать в командной строке - PullRequest
4 голосов
/ 19 декабря 2009

Предположим, у вас есть программа с несколькими определенными функциями. Каждая функция вызывается в отдельном цикле for. Можно ли указать, какую функцию следует вызывать из командной строки?

Пример:

python prog.py -x <<<filname>>>

Где -x говорит Python перейти к определенному циклу for и затем выполнить функцию, вызванную этим циклом for?

Спасибо, Seafoid.

Ответы [ 5 ]

10 голосов
/ 19 декабря 2009

идиома Python для главной точки входа:

if __name__ == '__main__':
    main()

Заменить main() любой функцией, которая должна идти первой ... (подробнее о if name ...: http://effbot.org/pyfaq/tutor-what-is-if-name-main-for.htm)

Если вы хотите указать функцию для запуска через аргумент командной строки, просто проверьте эти аргументы, либо вручную, либо с помощью некоторых помощников, например, http://docs.python.org/library/optparse.html,, затем переход к нужной функции.

Если вам не нужны такие вещи:

if options.function_to_call == 'mydesiredfunction':
    mydesiredfunction()

Вы можете воспользоваться getattr.

И, наконец, еще один «общий» подход с использованием globals (исключение обработки исключено):

$ cat 1933407.py

#!/usr/bin/env python
# coding: utf-8

import sys

def first():
    print '1 of 9'

def second():
    print '2 of 9'

def seventh():
    print '7 of 9'

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

Тем временем в командной строке ...

$ python 1933407.py second
2 of 9
8 голосов
/ 19 декабря 2009

Требуется модуль sys.

Например:

import sys

#Functions
def a(filename): pass
def b(filename): pass
def c(filename): pass

#Function chooser
func_arg = {"-a": a, "-b": b, "-c": c}

#Do it
if __name__ == "__main__":
    func_arg[sys.argv[1]](sys.argv[2])

Который запускается a(filename), если вы запускаете python file.py -a filename

4 голосов
/ 19 декабря 2009

Если вы просто хотите использовать это для быстрого тестирования различных функций во время разработки и аналогичных ситуациях, вы можете использовать параметр командной строки -c:

python -c 'import myfile; myfile.somefunc()'
1 голос
/ 19 декабря 2009

Очень простой способ следующий:

import sys

x_is_set=False
for arg in sys.argv[1:]:
    if arg == '-x':   x_is_set=True

if x_is_set:
    print "-x is set"
0 голосов
/ 19 декабря 2009

Да, встроенные функции 'exec ()' и 'eval ()' - ваши друзья. Просто добавьте '()' к названию функции. Тем не менее, вы должны задаться вопросом, является ли это лучшим решением для актуальной проблемы. Факт, что это технически возможно, не означает, что это также лучшее решение. Использование «exec ()» и «eval ()» обычно считается «избегаемым».

...