У меня есть этот код:
def hello():
return 'Hi :)'
Как бы я запустил это прямо из командной строки?
У меня есть этот код:
def hello():
return 'Hi :)'
Как бы я запустил это прямо из командной строки?
С аргументом -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()'
Просто поставьте hello()
где-нибудь ниже функции и он выполнит, когда вы сделаете python your_file.py
Для более чистого решения вы можете использовать это:
if __name__ == '__main__':
hello()
Таким образом, функция будет выполняться только при запуске файла, а не при импорте файла.
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__"
.
Я написал быстрый маленький 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 может находиться в любом месте вашего пути.
добавьте этот фрагмент в конец вашего скрипта
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
.
Если вы устанавливаете пакет runp с помощью pip install runp
это вопрос запуска:
runp myfile.py hello
Вы можете найти репозиторий по адресу: https://github.com/vascop/runp
Интересно, что если цель заключалась в том, чтобы печатать на консоль командной строки или выполнять какую-то другую минутную операцию python, вы можете вводить входной сигнал в интерпретатор python следующим образом:
echo print("hi:)") | python
а также файлы труб.
python < foo.py
* Обратите внимание, что расширение не должно быть .py для второго, чтобы работать. ** Также обратите внимание, что для bash вам может понадобиться избежать символов
echo print\(\"hi:\)\"\) | python
Давайте сделаем это немного проще для себя и просто используем модуль...
Попробуйте: 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 (диапазон, строка и т.д.) в командной строке и записал инструмент 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.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 "import Odd_Even_function; Odd_Even_function.OE(100)"
Вариант 2 Полный путь к exe\python.exe -c "из Odd_Even_function import OE; OE (100)"
Благодарю.
Эта функция не может быть запущена из командной строки, так как она возвращает значение, которое будет неактивным. Вы можете удалить возврат и использовать печать вместо
Используйте инструмент python-c (pip install python-c), а затем просто напишите:
$ python-c foo 'hello()'
или в случае, если в файлах python нет столкновений с именами функций:
$ python-c 'hello()'
Сначала вы должны вызвать функцию, как они сказали вам, или основание ничего не отобразит в выходных данных, после этого сохраните файл и скопируйте путь к файлу, щелкнув правой кнопкой мыши на папке файла и нажав "Копировать файл", затем перейдите в терминал и напишите: - cd "путь к файлу" - python "имя файла, например (main.py)", после чего он отобразит вывод вашего кода.