如何从命令行运行if __name __ ==“__ main__”中未包含的单独函数?

时间:2018-05-23 07:46:33

标签: python shell

我有一个python文件,其中包含以下代码

test.py

def sum(a, b):
    print(a+b)

def final():
    print("Hello")
    sum(10, 9)


if __name__=="__main__":
    final()

现在我从命令行运行

python test.py

我得到了

Hello
19

现在我想添加一个函数say,它将从命令行中单独调用。我该怎么做?所以我的更新代码将是

def sum(a, b):
    print(a+b)

def say():
    print("Yes!!!")

def final():
    print("Hello")
    sum(10, 9)


if __name__=="__main__":
    final()

所以现在我想单独调用函数say。我试着这样做

python test.py say

但它只输出以前的结果。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

从源文件所在的目录命令行启动python解释器。然后就可以了

from test import say
say()

修改

根据上面的评论,您可以检查sys.argv以查找是否使用“say”调用模块:

import sys

if __name__ == '__main__':
    if 'say' in sys.argv:
        say()
    else:
        final()

sys.argv是一个列表,其中包含调用模块的所有参数,因此如果您从命令行运行

python test.py say foo bar

然后

sys.argv = ['test.py', 'say', 'foo', 'bar']

在你的程序中。

答案 1 :(得分:2)

您的代码必须以某种方式知道该做什么。这留下了两个选择:

<强> 1。代码将根据外部信息决定做什么:

一个。从环境中读取变量:

import os

if os.environ.get('TERM') == 'xterm-256color':
    say()
else:
    final()

您可以在调用脚本之前设置环境变量,如下所示:

# set the variable
$ export VARIABLE=VALUE

# Python will recognize it:
$ python -c "import os; print(os.environ.get('VARIABLE'))"
$ VALUE

湾掷骰子:

from random import randint

if randint(0,6) > 3:
    say()
else:
    final()

<强> 2。您将告诉代码该做什么:

一个。检查sys.argv(参见其他答案)。

推荐:使用https://help.apple.com/xcode/mac/8.0/#/dev3ec8a1cb4解析命令:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--say", help="If say, then say", action="store_true")
args = parser.parse_args()

if args.say:
   say()
else:
   final()

现在,从命令行运行:python test.py --say

Argparse是标准python库的一部分,具有出色的文档,易于使用和阅读,并且(在我看来)非常灵活。

℃。对于稍微大一些的脚本/项目,请使用setuptools入口点:     详情argparse libraryon this related question