Запустить функцию из командной строки - PullRequest
293 голосов
/ 21 октября 2010

У меня есть этот код:

def hello():
    return 'Hi :)'

Как бы я запустил это прямо из командной строки?

Ответы [ 15 ]

466 голосов
/ 21 октября 2010

С аргументом -c (команда) (при условии, что ваш файл называется foo.py):

$ python -c 'import foo; print foo.hello()'

В качестве альтернативы, если вас не волнует загрязнение пространства имен:

$ python -c 'from foo import *; print hello()'

И середина:

$ python -c 'from foo import hello; print hello()'
113 голосов
/ 21 октября 2010

Просто поместите hello() где-нибудь ниже функции, и она будет выполняться, когда вы выполните python your_file.py

. Для более точного решения вы можете использовать это:

if __name__ == '__main__':
    hello()

Таким образом, функциябудет выполняться только при запуске файла, а не при его импорте.

51 голосов
/ 21 октября 2010

python -c 'from myfile import hello; hello()', где myfile должно быть заменено базовым именем вашего скрипта Python.(Например, myfile.py становится myfile).

Однако, если hello() является вашей «постоянной» главной точкой входа в вашем скрипте Python, то обычный способ сделать это так:

def hello():
    print "Hi :)"

if __name__ == "__main__":
    hello()

Это позволяет вам выполнить скрипт, просто запустив python myfile.py или python -m myfile.

Некоторое объяснение здесь: __name__ - это специальная переменная Python, которая содержит имя модулявыполняется в настоящее время, за исключением , когда модуль запускается из командной строки, в этом случае он становится "__main__".

24 голосов
/ 18 марта 2015

Я написал быстрый маленький скрипт на Python, который можно вызывать из командной строки bash. Он принимает имя модуля, класса и метода, который вы хотите вызвать, и параметры, которые вы хотите передать. Я назвал его PyRun, отключил расширение .py и сделал его исполняемым с помощью chmod + x PyRun, чтобы я мог просто быстро вызвать его следующим образом:

./PyRun PyTest.ClassName.Method1 Param1

Сохраните это в файле с именем PyRun

#!/usr/bin/env python
#make executable in bash chmod +x PyRun

import sys
import inspect
import importlib
import os

if __name__ == "__main__":
    cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
    if cmd_folder not in sys.path:
        sys.path.insert(0, cmd_folder)

    # get the second argument from the command line      
    methodname = sys.argv[1]

    # split this into module, class and function name
    modulename, classname, funcname = methodname.split(".")

    # get pointers to the objects based on the string names
    themodule = importlib.import_module(modulename)
    theclass = getattr(themodule, classname)
    thefunc = getattr(theclass, funcname)

    # pass all the parameters from the third until the end of 
    # what the function needs & ignore the rest
    args = inspect.getargspec(thefunc)
    z = len(args[0]) + 2
    params=sys.argv[2:z]
    thefunc(*params)

Вот пример модуля, чтобы показать, как он работает. Это сохраняется в файле с именем PyTest.py:

class SomeClass:
 @staticmethod
 def First():
     print "First"

 @staticmethod
 def Second(x):
    print(x)
    # for x1 in x:
    #     print x1

 @staticmethod
 def Third(x, y):
     print x
     print y

class OtherClass:
    @staticmethod
    def Uno():
        print("Uno")

Попробуйте запустить эти примеры:

./PyRun PyTest.SomeClass.First
./PyRun PyTest.SomeClass.Second Hello
./PyRun PyTest.SomeClass.Third Hello World
./PyRun PyTest.OtherClass.Uno
./PyRun PyTest.SomeClass.Second "Hello"
./PyRun PyTest.SomeClass.Second \(Hello, World\)

Обратите внимание на последний пример экранирования скобок для передачи кортежа в качестве единственного параметра для метода Second.

Если вы передадите слишком мало параметров для того, что нужно методу, вы получите ошибку. Если вы передаете слишком много, он игнорирует дополнительные. Модуль должен находиться в текущей рабочей папке, поставить PyRun можно в любом месте вашего пути.

13 голосов
/ 16 октября 2018

добавьте этот фрагмент в конец вашего скрипта

def myfunction():
    ...


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

Теперь вы можете вызывать свою функцию, выполнив

python myscript.py myfunction

Это работает, потому что вы передаете аргумент командной строки (aстрока имени функции) в locals, словарь с текущей таблицей локальных символов.В конце парантезы функция будет вызываться.

update: если вы хотите, чтобы функция принимала параметр из командной строки, вы можете передать sys.argv[2] следующим образом:

def myfunction(mystring):
    print mystring


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

Таким образом, выполнение python myscript.py myfunction "hello" выдаст hello.

5 голосов
/ 05 июня 2017

Давайте сделаем это немного проще для нас самих и просто используем модуль ...

Попробуйте: pip install compago

Затем напишите:

import compago
app = compago.Application()

@app.command
def hello():
    print "hi there!"

@app.command
def goodbye():
    print "see ya later."

if __name__ == "__main__":
    app.run()

Затем используйтевот так:

$ python test.py hello
hi there!

$ python test.py goodbye
see ya later.

Примечание: на данный момент есть ошибка в Python 3, но прекрасно работает с Python 2.

Редактировать: Еще лучшим вариантом, на мой взгляд, является модуль fire от Google, который позволяет легко передавать аргументы функций.Устанавливается с pip install fire.Из их GitHub:

Вот простой пример.

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

Затем из командной строки вы можете запустить:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30
5 голосов
/ 11 февраля 2016

Интересно, что если цель состояла в том, чтобы напечатать на консоль командной строки или выполнить какую-либо другую мелкую операцию на python, вы можете передать ввод в интерпретатор python следующим образом:

echo print("hi:)") | python

, а также файлы канала..

python < foo.py

* Обратите внимание, что расширение не должно быть .py, чтобы секунда работала.** Также обратите внимание, что для bash вам может понадобиться экранировать символы

echo print\(\"hi:\)\"\) | python
5 голосов
/ 29 декабря 2015

Если вы устанавливаете пакет runp с pip install runp, это вопрос запуска:

runp myfile.py hello

Вы можете найти репозиторий по адресу: https://github.com/vascop/runp

4 голосов
/ 17 марта 2017

У меня было требование использовать различные утилиты Python (диапазон, строка и т. Д.) В командной строке, и я специально для этого написал инструмент pyfunc .Вы можете использовать его, чтобы обогатить ваш опыт использования командной строки:

 $ pyfunc -m range -a 1 7 2
 1
 3
 5

 $ pyfunc -m string.upper -a test
 TEST

 $ pyfunc -m string.replace -a 'analyze what' 'what' 'this'
 analyze this
1 голос
/ 20 сентября 2018

Ниже приведен файл Odd_Even_function.py, в котором есть определение функции.

def OE(n):
    for a in range(n):
        if a % 2 == 0:
            print(a)
        else:
            print(a, "ODD")

Теперь для вызова этого из командной строки ниже приведены варианты, которые были сработаны для меня.

Параметры 1 Полный путь к exe \ python.exe -c "import Odd_Even_function; Odd_Even_function.OE (100)"

Опция 2 Полный путь к exe \ python.exe -c "из Odd_Even_function import OE; OE (100)"

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...