Запустить функцию из командной строки

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

def hello():
    return 'Hi :)'

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

Ответ 1

С аргументом -c (command) (если ваш файл имеет имя foo.py):

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

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

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

И средняя земля:

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

Ответ 2

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

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

if __name__ == '__main__':
    hello()

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

Ответ 3

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

Однако, если hello() является вашей "постоянной" основной точкой входа в вашем Python script, тогда обычный способ сделать это выглядит следующим образом:

def hello():
    print "Hi :)"

if __name__ == "__main__":
    hello()

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

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

Ответ 4

Я написал быстрый маленький Python script, который можно вызвать из командной строки 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 может находиться в любом месте вашего пути.

Ответ 5

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

def myfunction():
    ...


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

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

python myscript.py myfunction

Это работает, потому что вы передаете аргумент командной строки (строку имени функции) в 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.

Ответ 6

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

runp myfile.py hello

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

Ответ 7

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

echo print("hi:)") | python

а также файлы труб.

python < foo.py

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

echo print\(\"hi:\)\"\) | python

Ответ 8

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

Попробуйте: 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.

Edit: даже лучший вариант, на мой взгляд, является модуль пожара с помощью 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

Ответ 9

У меня было требование использовать различные служебные программы 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

Ответ 10

Всегда можно ввести python в командной строке с помощью команды python

затем импортируйте файл так import example_file

затем запустите команду с помощью example_file.hello()

Это позволяет избежать странной функции копирования .pyc, которая появляется при каждом запуске python -c и т.д.

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

Ответ 11

Что-то вроде этого: call_from_terminal.py

# call_from_terminal.py
# Ex to run from terminal
# ip='"hi"'
# python -c "import call_from_terminal as cft; cft.test_term_fun(${ip})"
# or
# fun_name='call_from_terminal'
# python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
def test_term_fun(ip):
    print ip

Это работает в bash.

$ ip='"hi"' ; fun_name='call_from_terminal' 
$ python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
hi

Ответ 12

Ниже приведен файл 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)"

Благодарю.

Ответ 13

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

Ответ 14

Используйте инструмент python-c (pip install python-c), а затем просто напишите:

$ python-c foo 'hello()'

или в случае, если в файлах python нет столкновений с именами функций:

$ python-c 'hello()'

Ответ 15

Сначала вы должны вызвать функцию, как они сказали вам, или основание ничего не отобразит в выходных данных, после этого сохраните файл и скопируйте путь к файлу, щелкнув правой кнопкой мыши на папке файла и нажав "Копировать файл", затем перейдите в терминал и напишите: - cd "путь к файлу" - python "имя файла, например (main.py)", после чего он отобразит вывод вашего кода.