Ответы:
С аргументом -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()'
$python -c "import foo;foo.hello()"
print foo.hello()
на print(foo.hello())
сделал. Я не обладаю знаниями Python, чтобы объяснить, почему это так, поэтому, если кто-то еще сможет объяснить, что может происходить, это будет с благодарностью
Просто поместите hello()
где-нибудь ниже функции, и она будет выполняться, когда вы делаетеpython your_file.py
Для более аккуратного решения вы можете использовать это:
if __name__ == '__main__':
hello()
Таким образом, функция будет выполняться только при запуске файла, а не при импорте файла.
hello()
принимать аргументы, которые должны быть предоставлены командной строкой?
sys.argv
в метод. Или получить доступ к нему из Привет метод
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 -m foo -c 'foo.bar()'
и python -c 'import foo; foo.bar()'
? Я получаю другое поведение, когда кажется, что аргумент -c игнорируется в первом случае.
Я написал небольшой скрипт на 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\)
Обратите внимание на последний пример экранирования скобок для передачи кортежа в качестве единственного параметра для метода 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
.
myfunction(12)
Давайте сделаем это немного проще для себя и просто используем модуль ...
Пытаться: 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 -m fire file_name method_name
. Он также имеет встроенный argparser.
Интересно, что если цель состояла в том, чтобы напечатать на консоль командной строки или выполнить какую-либо другую мелкую операцию на python, вы можете передать ввод в интерпретатор python следующим образом:
echo print("hi:)") | python
а также файлы труб ..
python < foo.py
* Обратите внимание, что расширение не должно быть .py для второго, чтобы работать. ** Также обратите внимание, что для bash вам может понадобиться экранировать символы
echo print\(\"hi:\)\"\) | python
echo import foo;foo.hello() | python
echo 'print("hi:)")' | python
Если вы устанавливаете пакет runp с pip install runp
вопросом запуска:
runp myfile.py hello
Вы можете найти репозиторий по адресу: https://github.com/vascop/runp
У меня было требование использовать различные утилиты 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
затем импортируйте ваш файл, чтобы импортировать 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)"
Спасибо.
Сначала вы должны вызвать функцию, как они сказали вам, или основание ничего не отобразит в выходных данных, после чего сохраните файл и скопируйте путь к файлу, щелкнув правой кнопкой мыши на папке файла и нажав «Копировать файл», затем зайдите в терминал и напишите: - cd "путь к файлу" - python "имя файла, например (main.py)", после чего он отобразит вывод вашего кода.
print "Hi :)"
вместоreturn 'Hi :)'
.