Python:从命令行运行函数
我在我的文件中有下面的代码:
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
时就会执行它
对于一个整洁的解决scheme,你可以使用这个:
if __name__ == '__main__': hello()
这样,只有在运行文件时才会执行该function,而不是在导入文件时执行。
python -c 'from myfile import hello; hello()'
python -c 'from myfile import hello; hello()'
其中, myfile
必须replace为您的Python脚本的基本名称。 (例如, myfile.py
成为myfile
)。
但是,如果hello()
是您的Python脚本中的“永久”主入口点,那么通常的做法如下:
def hello(): print "Hi :)" if __name__ == "__main__": hello()
这使您可以通过运行python myfile.py
或python -m myfile
来执行脚本。
这里有一些解释: __name__
是一个特殊的Pythonvariables,它保存当前正在执行的模块的名称, 除非模块是从命令行启动的,在这种情况下变成"__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\)
请注意,最后一个转义括号的例子是传入一个元组作为第二个方法的唯一参数。
如果您传递的方法太less,则需要input错误。 如果你通过太多,它会忽略额外的。 该模块必须在当前的工作文件夹中,把PyRun可以在你的path中的任何地方。
有趣的是,如果目标是打印到命令行控制台或执行其他一些简单的python操作,你可以inputpython解释器像这样:
echo print("hi:)") | python
以及pipe道文件..
python < foo.py
*请注意,扩展名不一定是.py第二个工作。 **另外请注意,对于bash,您可能需要转义字符
echo print\(\"hi:\)\"\) | python
我有要求在命令行上使用各种python实用程序(范围,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在命令行inputpython总是一个选项
然后导入你的文件,所以导入example_file
然后使用example_file.hello()运行命令
这样可以避免每次运行python -c时出现奇怪的.pyc复制函数等等。
也许不如单一命令那么方便,但是从命令行快速修复文本文件,并允许你使用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
让我们来简化一下自己,然后使用一个模块。
试试: 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来说效果很好。
编辑:一个更好的select,在我看来是由谷歌火灾模块,这使得它也容易传递函数参数。 它与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-c工具( pip install python-c ),然后简单地写:
$ python-c foo 'hello()'
或者你的python文件中没有函数名冲突:
$ python-c 'hello()'