【问题标题】:How to run a separate function not included in if __name__=="__main__" from the command line?如何从命令行运行 if __name__=="__main__" 中未包含的单独函数?
【发布时间】:2018-11-02 02:33:30
【问题描述】:

我有一个包含以下代码的 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

但它只输出以前的结果。我怎样才能使它工作?

【问题讨论】:

  • say 将出现在您的参数中,因此请在脚本中测试您的参数。
  • @MarkSetchell 很抱歉,我不太明白。您能详细说明一下吗?
  • final 之前添加一行打印sys.argv 并使用python test.py say 运行您的脚本,您将看到您的程序可以检测到say 作为参数的存在。如果是,请致电say

标签: python shell


【解决方案1】:

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

from test import say
say()

编辑:

根据上面的 cmets,你可以检查 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']

在你的程序中。

【讨论】:

  • 有什么办法可以从命令行执行吗?因为我有一个执行命令行查询的 cron 作业。
  • 当模块从命令行运行时,它的名字将是'main',所以你在问题中编写了你的​​程序,它会调用final( ) 功能。只有在将模块导入其他地方时,模块才会有另一个名称。我会参考@MarkSetchell 的建议并查看 sys.args,它是从命令行调用模块的所有参数的列表。
【解决方案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

b.掷骰子:

from random import randint

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

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

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

b. 推荐:使用argparse library解析命令:

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 库的一部分,具有出色的文档,易于使用和阅读,并且(在我看来)非常灵活。

c。对于更大的脚本/项目,使用 setuptools 入口点: 详情on this related questionthis post

【讨论】:

  • 我认为,如果您解释了 1a) 如何您可以在运行脚本之前设置环境变量,并且如果在 2) 您解释了,您的答案会更有用为什么建议引入一个新的对argparse的依赖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2017-07-16
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2018-11-22
相关资源
最近更新 更多