从 bash shell 脚本调用 Python 脚本 [重复]

Posted

技术标签:

【中文标题】从 bash shell 脚本调用 Python 脚本 [重复]【英文标题】:Call Python script from bash shell script [duplicate] 【发布时间】:2019-10-31 11:36:28 【问题描述】:

我正在尝试实现一个命令,该命令涉及将POST/GET 请求发送到远程服务器并解释JSON 格式结果。由于通过bash解析JSON相当困难,所以我决定先编写python脚本并在shell脚本中调用它。

我的 shell 脚本现在看起来像这样

#!/bin/sh
case $1 in
  submit-job)
    python3 src/submit-job.py
    ;;
  lists-job)
    python3 src/lists-job.py
    ;;
  ....and so on
esac

我希望我的用户可以使用以下命令。

Job submit-job argument1 argument2...
Job lists-job
...and so on

基本上。我只有一个名为Job.py 的Python 类文件,包括submit-joblists-job 等多个函数。 但是,为了将不同的函数分隔到不同的命令参数,我必须创建单独的 python 文件来触发它。 (如submit-job.pylists-job.py)。

例如。 提交作业.py

from Job import Job

j = Job()
j.submit_job()

lists-job.py

from Job import Job

j = Job()
j.lists_job()

如您所见,它们非常相似。有没有更好的方法或最佳实践来实现我想要的?

【问题讨论】:

python job-tools.py submit,然后让您的 Python 脚本检查其命令行参数。 (更好的是,让 distutils/setuptools 创建一个可执行包装器,然后它只是 job-tools submit,不需要显式调用 python 解释器)。 一种常见的技术是拥有一个包含多个链接的文件,然后让程序检查 $0。 @WilliamPursell, ...或者,在 Python 的意义上,检查 sys.argv[0] 谢谢!我去看看 distutils 【参考方案1】:

为什么不在 Python 中执行 if/else?

import sys
from Job import Job

j = Job()
arg = sys.argv[1]
if arg == 'submit-job':
    j.submit_job()
elif ...
    ...

现在您可以在 bash 脚本中调用它,传递参数,甚至已经删除 bash 脚本并直接从命令行调用 Python 脚本。

【讨论】:

这是一个我没有想过的好方法。谢谢!

以上是关于从 bash shell 脚本调用 Python 脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 haskell 程序调用 bash 或 shell 脚本?

有没有用 go 或者 python 代替 shell 脚本的

管道到头部导致从 python 调用的 shell 脚本中的管道损坏

无法从 bash shell 脚本执行 Tcl 脚本

Automator bash shell 脚本问题

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?