Run function from the command line
我有这个代码:
1 2 | def hello(): return 'Hi :)' |
我如何直接从命令行运行它?
与
1 | $ python -c 'import foo; print foo.hello()' |
alternatively,如果你不在乎什么命名空间污染: </P >
1 | $ python -c 'from foo import *; print hello()' |
和中间的地面。 </P >
1 | $ python -c 'from foo import hello; print hello()' |
是的,然后把
一种neater溶液中你能使用这个: </P >
1 2 | if __name__ == '__main__': hello() |
那路的函数将executed是只读的,如果你运行的文件,而不是当你导入的文件。 </P >
在
然而,如果
1 2 3 4 5 | def hello(): print"Hi :)" if __name__ =="__main__": hello() |
这允许你到执行的脚本是由运行
这里的一些说明:
一封快速小的Python脚本,这是从一个callable bash的命令行。把它的名称在模块、类和方法,你想呼叫和参数,你想通了。我呼叫它pyrun和左非.py扩展机制和它与executable chmod + X pyrun所以我能呼叫,它为后续的:快,快,快 </P >
1 | ./PyRun PyTest.ClassName.Method1 Param1 |
这个文件保存在一个被称为pyrun </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #!/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: </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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") |
尝试运行这些例子: </P >
1 2 3 4 5 6 | ./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\) |
最后一个音符example of escaping的parentheses到通在一个元组为只读参数的第二个方法。 </P >
如果你通太少的参数用什么方法的需求,你得到的错误。如果你通的太多,它ignores额外的。该模块必须在当前工作目录,然后把pyrun可以anywhere在你的路径。 </P >
将此代码段添加到脚本底部
1 2 3 4 5 6 | def myfunction(): ... if __name__ == '__main__': globals()[sys.argv[1]]() |
现在可以通过运行调用函数
1 | python myscript.py myfunction |
这是因为您要将命令行参数(函数名称的字符串)传递到
更新:如果希望函数接受命令行中的参数,可以这样传入
1 2 3 4 5 6 | def myfunction(mystring): print mystring if __name__ == '__main__': globals()[sys.argv[1]](sys.argv[2]) |
这样,运行
让我们从一个小麦克,这是我们自己的easier和是使用模块………………… </P >
然后写: </P >
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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() |
然后,使用类): </P >
1 2 3 4 5 | $ python test.py hello hi there! $ python test.py goodbye see ya later. |
注:这是一个错误,在Python中的3阶矩,但厂与大Python2。 </P >
编辑:平安夜是更好的选择,在我看来是火,用谷歌的这一模块,使得它容易的也通arguments函数。这是installed与
这是一个简单的实例。 </P >
1 2 3 4 5 6 7 8 9 10 | import fire class Calculator(object): """A simple calculator class.""" def double(self, number): return 2 * number if __name__ == '__main__': fire.Fire(Calculator) |
然后,从命令行运行,你可以: </P >
1 2 | python calculator.py double 10 # 20 python calculator.py double --number=15 # 30 |
interestingly足够的,如果目标是到打印到控制台或命令行颈静脉孔区的一些其他的Python分钟的操作,你可以输入管入Python interpreter状): </P >
1 | echo print("hi:)") | python |
AS AS管好档案………………… </P >
1 | python < foo.py |
*注,这对延长并不都是.py协会第二次工作。 * * * * *的注意,也毁灭猛击你可能需要逃亡中的人物 </P >
1 | echo print\("hi:\)"\) | python |
如果你安装的runp包装与
你可以找到的版本库的https:/ / / / runp vascop github.com </P >
我有一个要求利用各种公用事业(range,Python字符串等)的命令行和有书面的机床,特别是pyfunc所说的。你可以使用它来丰富你的命令行使用的经验: </P >
1 2 3 4 5 6 7 8 9 10 | $ 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 |
下面是具有函数定义的奇数_-even_function.py文件。
1 2 3 4 5 6 | def OE(n): for a in range(n): if a % 2 == 0: print(a) else: print(a,"ODD") |
现在从下面的命令提示符调用相同的选项对我来说是有效的。
选项1exepython.exe-c的完整路径"导入奇数-偶数函数;奇数-偶数-函数.oe(100)"
选项2exepython.exe-c的完整路径"从奇数偶数函数导入oE;oE(100)"
谢谢。
这一类的东西: 呼叫_从_ terminal.py </P >
1 2 3 4 5 6 7 8 9 | # 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。 </P >
1 2 3 | $ ip='"hi"' ; fun_name='call_from_terminal' $ python -c"import ${fun_name} as cft; cft.test_term_fun(${ip})" hi |
这是永远的期权的回车键的Python命令行与Python命令行 </P >
当时的进出你的文件,以文件_进出 </P >
然后运行该命令,用以_ file.hello(的) </P >
这avoids的古怪的.pyc copy函数的作物上,每一次你运行的Python的C等。 </P >
也许不为convenient作为一个单一的命令,但一个好的快速修复的一个文本文件,从命令行线,和允许你使用Python的OP的呼叫和执行你的文件。 </P >
这个函数是不能从命令行运行时返回的值为它这将去unhanded。。。。。。。你可以和使用remove的回报,而不是打印 </P >
首先,您必须按照他们告诉您的方式调用函数,否则输出中将不显示任何内容,然后保存文件并通过右键单击文件文件夹并单击"复制文件",复制文件路径,然后转到终端并写入:-cd"文件路径"-python"例如文件名(main.py)"之后,它将显示代码的输出。
使用python-c工具(pip安装python-c),然后简单地写:
1 | $ python-c foo 'hello()' |
或者,如果您的python文件中没有函数名冲突:
1 | $ python-c 'hello()' |