从命令行运行函数

问题描述 投票:283回答:15

我有这个代码:

def hello():
    return 'Hi :)'

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

python function command-line
15个回答
463
投票

使用-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
投票

使用命令python在命令行上输入python始终是一个选项

然后导入您的文件,导入example_file

然后使用example_file.hello()运行该命令

这避免了每次运行python -c等时出现的奇怪的.pyc复制函数。

可能不像单个命令那样方便,但是可以快速修复从命令行发送文件,并允许您使用python来调用和执行您的文件。


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

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“import Odd_Even_function; Odd_Even_function.OE(100)”

选项2 exed \ python.exe -c“的完整路径来自Odd_Even_function import OE; OE(100)”

谢谢。


0
投票

此函数无法从命令行运行,因为它返回的值将是无效的。您可以删除返回并改为使用print


-1
投票

使用python-c工具(pip install python-c),然后简单地写:

$ python-c foo 'hello()'

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

$ python-c 'hello()'

-1
投票

首先,您必须按照他们告诉您的方式调用该函数,否则函数将在输出中显示任何内容,之后保存文件并通过右键单击该文件的文件夹并单击“复制文件”然后单击该文件的路径转到终端并写: - cd“文件的路径” - python“文件的名称,例如(main.py)”之后它将显示代码的输出。


112
投票

只需将hello()放在函数下面的某个位置,它就会在你执行python your_file.py时执行

对于更简洁的解决方案,您可以使用:

if __name__ == '__main__':
    hello()

这样,只有在运行文件时才会执行该功能,而不是在导入文件时执行。


50
投票

python -c 'from myfile import hello; hello()'其中myfile必须替换为Python脚本的基本名称。 (例如,myfile.py成为myfile)。

但是,如果hello()是Python脚本中的“永久”主要入口点,那么通常的方法如下:

def hello():
    print "Hi :)"

if __name__ == "__main__":
    hello()

这允许您只需运行python myfile.pypython -m myfile即可执行脚本。

这里有一些解释:__name__是一个特殊的Python变量,它保存当前正在执行的模块的名称,除非从命令行启动模块,在这种情况下它变为"__main__"


24
投票

我写了一个快速的小Python脚本,可以从bash命令行调用。它采用您要调用的模块,类和方法的名称以及要传递的参数。我称之为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\)

注意最后一个转义括号的示例,以传入元组作为Second方法的唯一参数。

如果为方法所需的参数传递的参数太少,则会出现错误。如果你传球太多,它会忽略额外的东西。模块必须在当前工作文件夹中,把PyRun放在你的路径的任何地方。


13
投票

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

def myfunction():
    ...


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

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

python myscript.py myfunction

这是有效的,因为您将命令行参数(函数名称的字符串)传递给locals,这是一个带有当前本地符号表的字典。最后的parantheses将使函数被调用。

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

def myfunction(mystring):
    print mystring


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

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


5
投票

如果您使用pip install runp安装runp软件包,则需要运行:

runp myfile.py hello

您可以在以下位置找到存储库:https://github.com/vascop/runp


5
投票

有趣的是,如果目标是打印到命令行控制台或执行其他一些微小的python操作,你可以将输入管道输入python解释器,如下所示:

echo print("hi:)") | python

以及管道文件..

python < foo.py

*请注意,扩展名不一定是.py,第二个工作。 **另请注意,对于bash,您可能需要转义字符

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

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中效果很好。

编辑:一个更好的选择,在我看来是谷歌的模块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

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
© www.soinside.com 2019 - 2024. All rights reserved.