我有这段代码:
def hello():
return 'Hi :)'
我如何直接从命令行运行它?
答案 0 :(得分:454)
使用-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()'
答案 1 :(得分:107)
只需将hello()
放在函数下方的某个位置,它就会在python your_file.py
对于更简洁的解决方案,您可以使用:
if __name__ == '__main__':
hello()
这样,只有在运行文件时才会执行该功能,而不是在导入文件时执行。
答案 2 :(得分:49)
python -c 'from myfile import hello; hello()'
其中myfile
必须替换为Python脚本的基本名称。 (例如,myfile.py
变为myfile
)。
但是,如果hello()
是Python脚本中的“永久”主入口点,那么通常的方法如下:
def hello():
print "Hi :)"
if __name__ == "__main__":
hello()
这使您只需运行python myfile.py
或python -m myfile
即可执行脚本。
这里有一些解释:__name__
是一个特殊的Python变量,它保存当前正在执行的模块的名称,当模块从命令行启动时,除了,在这种情况下它变为"__main__"
。
答案 3 :(得分:24)
我编写了一个可以从bash命令行调用的快速小Python脚本。它采用您要调用的模块,类和方法的名称以及要传递的参数。我把它称为PyRun并且不使用.py扩展名并使用chmod + x PyRun使其可执行,这样我就可以快速调用它,如下所示:
./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放在您的路径中的任何位置。
答案 4 :(得分:12)
将此代码段添加到脚本的底部
DECLARE @Date1 VARCHAR(10),@Date2 VARCHAR(10)
SET @Date1='January'
SET @Date2='DECEMBER'
;WITH CTE
AS
(
SELECT Number AS EnglishMOnthNumber,
DATENAME(MONTH,DATEADD(MONTH,NUMBER-DATEPART(MONTH,GETDATE()),GETDATE())) AS EnglishMOnth
FROM master.dbo.spt_values
WHERE NUmber Between 1 and 12
AND type='P'
)
SELECT MAX(CASE WHEN EnglishMOnth=@Date2 THEN EnglishMOnthNumber END)
- MAX( CASE WHEN EnglishMOnth=@Date1 THEN EnglishMOnthNumber END ) AS DiffInMonths
FROM CTE
您现在可以通过运行来调用函数
def myfunction():
...
if __name__ == '__main__':
globals()[sys.argv[1]]()
之所以有用,是因为您要将命令行参数(函数名称的字符串)传递到python myscript.py myfunction
(具有当前本地符号表的字典)中。最后的括号将使函数被调用。
更新:如果您希望函数从命令行接受参数,则可以像这样传递locals
:
sys.argv[2]
这样,运行def myfunction(mystring):
print mystring
if __name__ == '__main__':
globals()[sys.argv[1]](sys.argv[2])
将输出python myscript.py myfunction "hello"
。
答案 5 :(得分:5)
有趣的是,如果目标是打印到命令行控制台或执行其他一些微小的python操作,你可以输入python解释器,如下所示:
echo print("hi:)") | python
以及管道文件..
python < foo.py
*请注意,第二个扩展名不一定是.py。 **另请注意,对于bash,您可能需要转义字符
echo print\(\"hi:\)\"\) | python
答案 6 :(得分:5)
让我们自己更轻松一点,只需使用模块......
尝试:pip install compago
然后写:
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()
然后像这样使用:
$ python test.py hello
hi there!
$ python test.py goodbye
see ya later.
注意:目前Python 3中有bug,但在Python 2中效果很好。
修改:在我看来,更好的选择是Google的模块fire,它可以轻松传递函数参数。它随pip install fire
一起安装。来自他们的GitHub:
这是一个简单的例子。
import fire
class Calculator(object):
"""A simple calculator class."""
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
然后,从命令行,您可以运行:
python calculator.py double 10 # 20
python calculator.py double --number=15 # 30
答案 7 :(得分:5)
答案 8 :(得分:4)
我需要在命令行上使用各种python实用程序(范围,字符串等),并专门为此编写了工具pyfunc。您可以使用它来丰富命令行使用体验:
$ 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
答案 9 :(得分:1)
这样的事情: 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
答案 10 :(得分:1)
使用命令 python
在命令行输入python总是一个选项然后导入您的文件,以便导入example_file
然后使用 example_file.hello()
运行命令这避免了每次运行python -c等时出现的奇怪的.pyc复制函数。
可能不如单个命令方便,但可以快速修复从命令行发送文件,并允许您使用python来调用和执行文件。
答案 11 :(得分:1)
下面是具有该函数定义的Odd_Even_function.py文件。
def OE(n):
for a in range(n):
if a % 2 == 0:
print(a)
else:
print(a, "ODD")
现在可以在下面的命令提示符下调用相同的选项了。
选项1 exe \ python.exe -c的完整路径 “导入Odd_Even_function; Odd_Even_function.OE(100)”
选项2 exe \ python.exe -c的完整路径 “从Odd_Even_function导入OE; OE(100)”
谢谢。
答案 12 :(得分:0)
此函数无法从命令行运行,因为它返回一个无人值守的值。您可以删除返回并改为使用print
答案 13 :(得分:0)
让您的生活更轻松,安装Spyder。打开文件,然后运行它(单击绿色箭头)。之后,您的hello()
方法被定义并为IPython Console所知,因此您可以从控制台中调用它。
答案 14 :(得分:0)
我们可以这样写。我已经使用python-3.7.x
import sys
def print_fn():
print("Hi")
def sum_fn(a, b):
print(a + b)
if __name__ == "__main__":
args = sys.argv
# args[0] = current file
# args[1] = function name
# args[2:] = function args : (*unpacked)
globals()[args[1]](*args[2:])
python demo.py print_fn
python demo.py sum_fn 5 8
答案 15 :(得分:-1)
使用python-c工具( pip install python-c ),然后简单地写:
$ python-c foo 'hello()'
或者如果你的python文件中没有函数名冲突:
$ python-c 'hello()'
答案 16 :(得分:-1)
首先,您必须按照他们告诉您的方式调用该函数,否则该功能将在输出中不显示任何内容,之后保存该文件并通过右键单击该文件的路径来复制该文件的路径,然后单击“复制”文件”,然后转到终端并输入: -cd“文件的路径” -python“例如文件名(main.py)” 之后,它将显示您的代码输出。