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

У меня есть код ниже в моем файле:

def hello():
    return 'Hi :)'

Как я могу запустить это из командной строки?

14 ответов


С -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()'

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

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

if __name__ == '__main__':
    hello()

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


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__".


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

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

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


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

echo print("hi:)") | python

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

python < foo.py

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

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

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

runp myfile.py hello

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


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

попробуй: 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

У меня было требование использовать различные утилиты python(range, string и т. д.) в командной строке и написал инструмент 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

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


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

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

затем выполнить команду example_file.hello ()

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

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


что-то вроде этого: 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

ниже 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 "импорт Odd_Even_function; Odd_Even_function.OE (100)"

2 Полный путь к exe\python.exe-c "из Odd_Even_function импортировать OE; OE(100)"

спасибо.


использовать python-c (pip установить python-c) а потом просто написать:

$ python-c foo 'hello()'

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

$ python-c 'hello()'

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