others - python 在命令行中运行函数?

我的文件中有以下代码:


def hello():
 return 'Hi :)'

我该如何从命令行运行它?

时间:

使用-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()'必须使用python脚本的basename替换myfile ,(例如,myfile.py变成myfile )。

但是,如果hello()是python脚本中的"永久"的主入口点,那么执行这个操作的通常方法如下:


def hello():
 print"Hi :)"

if __name__ =="__main__":
 hello()

这允许你只运行python myfile.pypython -m myfile来执行脚本。

这里的一些解释:__name__是一个特殊的python变量,它保存当前正在执行的模块名称。

我编写了一个快速的python脚本,它可以从bash命令行调用,它接受要调用的模块,类和方法的名称以及要传递的参数,我将它称为PyRun并保留了py扩展名,并使它可用chmod +xPyRun可执行,因此我可以按如下所示快速调用它:


./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可以在你的路径中任意位置。

这里函数无法从 命令行 中运行,因为它返回一个将返回unhanded的值。 你可以删除返回并使用打印

在使用该命令 命令行 python, 它始终是一个选项来输入 python

然后导入你的文件所以导入 example_file

然后运行带有 example_file.hello()的命令

这样就避免了怪异. pyc 复制功能,当你每次运行得广泛 python -c等等。

也许不如single-command方便,但可以快速修复来自 命令行的文件,并允许你使用 python 调用并执行文件。

我创建了一个名为人行道的项目,它允许你为 python 函数创建标签关联。 它允许你在配置文件中注册函数,以便更容易地从 命令行 调用函数组。

下面是一个到PyPI下载页面的链接,包含更多信息: http://pypi.python.org/pypi/sidewalk/

像这样的东西: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

...