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

我有这个代码:

def hello():

return 'Hi :)'

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

可能你是说print"Hi :)"而不是return 'Hi :)'。

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

$ python -c 'import foo; print foo.hello()'

alternatively,如果你不在乎什么命名空间污染: </P >

$ python -c 'from foo import *; print hello()'

和中间的地面。 </P >

$ python -c 'from foo import hello; print hello()'

我注意到在Windows Shell上,您需要双引号而不是单引号。$python -c"import foo;foo.hello()"

如果文件不在本地目录或pythonpath上怎么办?

例如,在UbuntuLinux上,如果从qt应用程序内部运行命令,那么还必须使用双引号。

第二个是更一般的答案。我有一个脚本定义了多个客户函数,根据需要只调用一个。

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

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

if __name__ == '__main__':

hello()

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

这应该是正确的答案

如果hello()采用了应该由命令行提供的参数怎么办?

在这种情况下,您可以发送sys.argv到方法。或者从hello方法访问它

这个答案和import foo解决方案的一个区别是import foo允许在foo中调用任意函数,而不修改foo。

是的,但我不推荐超出测试目的的解决方案

@Wolph嘿,对于这个结构,我如何执行一个独立的函数(不包括在hello()中)并从命令行运行它?

你不能直接这么做。您可以执行一些sys.argv解析(例如,使用argparse来执行不同的方法)。

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

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

def hello():

print"Hi :)"

if __name__ =="__main__":

hello()

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

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

python -m foo -c 'foo.bar()'和python -c 'import foo; foo.bar()'有什么区别?我得到了不同的行为,在第一种情况下-c参数似乎被忽略了。

一封快速小的Python脚本,这是从一个callable bash的命令行。把它的名称在模块、类和方法,你想呼叫和参数,你想通了。我呼叫它pyrun和左非.py扩展机制和它与executable chmod + X pyrun所以我能呼叫,它为后续的:快,快,快 </P >

./PyRun PyTest.ClassName.Method1 Param1

这个文件保存在一个被称为pyrun </P >

#!/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 >

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 >

./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 >

很好,但这并不是问题的答案。

我不同意,这正是问题所在。他问你如何从一个文件中运行一个函数,这正是它的作用所在。

你能解释一下Cmd文件夹的作用吗?

将此代码段添加到脚本底部

def myfunction():

...

if __name__ == '__main__':

globals()[sys.argv[1]]()

现在可以通过运行调用函数

python myscript.py myfunction

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

更新:如果希望函数接受命令行中的参数,可以这样传入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)。

@少校,我已经更新了答案,包括怎么做

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

pip install compago吧: </P >

然后写: </P >

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 >

$ 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 >

import fire

class Calculator(object):

"""A simple calculator class."""

def double(self, number):

return 2 * number

if __name__ == '__main__':

fire.Fire(Calculator)

然后,从命令行运行,你可以: </P >

python calculator.py double 10  # 20

python calculator.py double --number=15  # 30

interestingly足够的,如果目标是到打印到控制台或命令行颈静脉孔区的一些其他的Python分钟的操作,你可以输入管入Python interpreter状): </P >

echo print("hi:)") | python

AS AS管好档案………………… </P >

python < foo.py

*注,这对延长并不都是.py协会第二次工作。 * * * * *的注意,也毁灭猛击你可能需要逃亡中的人物 </P >

echo print\("hi:\)"\) | python

考虑到foo.py和hello()的例子,这就是如何将其与上述想法结合使用的。echo import foo;foo.hello() | python

有没有办法用这个方法传递命令行参数?

fwiw,下面第三个例子稍微干净一点:echo 'print("hi:)")' | python。

如果你安装的runp包装与pip install runpITS的物系的运行: </P >

runp myfile.py hello </P >

你可以找到的版本库的https:/ / / / runp vascop github.com </P >

我有一个要求利用各种公用事业(range,Python字符串等)的命令行和有书面的机床,特别是pyfunc所说的。你可以使用它来丰富你的命令行使用的经验: </P >

$ 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文件。

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 >

# 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 >

$ 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),然后简单地写:

$ python-c foo 'hello()'

或者,如果您的python文件中没有函数名冲突:

$ python-c 'hello()'

不适用于python 3

谢谢你提出这个问题。我将添加对python 3的支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值