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)" после этого он отобразит вывод вашего кода.