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



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



def hello():
return 'Hi :)'


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

1207   14  

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

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

если вы передаете слишком мало параметров для того, что метод должен вы получите ошибку. Если вы проходите слишком много, он игнорирует дополнительные услуги. Модуль должен находиться в текущей рабочей папке, поставить 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

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

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

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

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

Это позволяет избежать странного .функция копирования 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 "import Odd_Even_function; Odd_Even_function.OE (100)"

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

спасибо.

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

$ python-c foo 'hello()'

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

$ python-c 'hello()'

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

Comments

    Ничего не найдено.