我有这个代码:
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的支持