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