关于python:从命令行运行函数

Run function from the command line

我有这个代码:

1
2
def hello():
    return 'Hi :)'

我如何直接从命令行运行它?


-c(命令行)argument(assuming你的文件名是foo.py): </P >

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()'


是的,然后把hello()的某个地方。下面的函数,它会执行,当你做的python your_file.py </P >

一种neater溶液中你能使用这个: </P >

1
2
if __name__ == '__main__':
    hello()

那路的函数将executed是只读的,如果你运行的文件,而不是当你导入的文件。 </P >


python -c 'from myfile import hello; hello()'myfile必须取代与basename,你的Python脚本。(例如,myfile.py变得myfile)。 </P >

然而,如果hello()是你的"永"的主要出入点在你的Python脚本,然后在通常的方式来做,这是为这些: </P >

1
2
3
4
5
def hello():
    print"Hi :)"

if __name__ =="__main__":
    hello()

这允许你到执行的脚本是由运行python myfile.pypython -m myfile。。。。。。。 </P >

这里的一些说明:__name__是一个特殊的变量,holds Python的模块的名称目前有executed,除非当模块是开始从命令行,在这一案例,它变得"__main__"。。。。。。。 </P >


一封快速小的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

这是因为您要将命令行参数(函数名称的字符串)传递到locals中,这是一个带有当前本地符号表的字典。结尾的paratesses将使函数被调用。

更新:如果希望函数接受命令行中的参数,可以这样传入sys.argv[2]

1
2
3
4
5
6
def myfunction(mystring):
    print mystring


if __name__ == '__main__':
    globals()[sys.argv[1]](sys.argv[2])

这样,运行python myscript.py myfunction"hello"将输出hello


让我们从一个小麦克,这是我们自己的easier和是使用模块………………… </P >

pip install compago吧: </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与pip install fire。。。。。。。他们从GitHub的: </P >

这是一个简单的实例。 </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包装与pip install runpITS的物系的运行: </P >

runp myfile.py hello </P >

你可以找到的版本库的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()'