如何在Python中将变量传递给shell函数?

时间:2016-04-04 07:28:23

标签: python shell

我想编写一个Python脚本来自动化将npm包的依赖项添加到我的Open Build Service项目的过程。我有一个shell函数:

app.config

这是我目前使用的Python脚本(导入的function cpobsn { cdobsa mkdir nodejs-$1 cd nodejs-$1 npm2PKGBUILD $1 > PKGBUILD cpserv obsa } 文件是npm包的package.json):

package.json

我想将import json import os with open("/home/fusion809/OBS/home:fusion809:arch_extra/arch-wiki-man/package/package.json") as json_file: json_data = json.load(json_file) deps = json_data["dependencies"] for key, value in deps.items(): print(key) os.system("cpobsn") 变量传递给key shell函数(即,我希望这个Python循环在每次迭代时都运行shell命令cpobsn)。我该怎么做?

3 个答案:

答案 0 :(得分:1)

函数适合交互式使用,但这似乎是您需要独立脚本的情况。

如果你想要一个可以加载到你的.zshrc或类似的函数,你也可以在脚本文件中执行类似Python __name__ == '__main__'习语的操作。但是将文件重命名为命令名称并删除该功能似乎是实现最终目标的最简单方法。

将其另存为$HOME/bin/cpobsnchmod +x。确保$HOME/bin也在PATH

#!/bin/sh
cdobsa
mkdir nodejs-"$1"
cd nodejs-"$1"
npm2PKGBUILD "$1" > PKGBUILD
cpserv
obsa

(注意添加适当的报价以获得良好的衡量标准。)

现在,您可以使用Python调用它,就像使用任何常规外部命令一样。

from subprocess import check_call
check_call(['cpobsn', key])

subprocess.call()subprocess.check_call()之间的选择取决于脚本是否返回有用的退出代码。它现在不是,所以实际上call就足够了;另一方面,你应该修复它,并使用check_call让Python告诉你shell脚本的某些部分何时失败。

最低限度地,将set -e添加到shell脚本将使其检查错误,并在任何失败时中止;但这通常需要重构以避免终止非致命错误(例如grep不返回结果 - 这在技术上是一个错误,但通常是正常流程的可接受部分。)

答案 1 :(得分:0)

将Python字符串连接与os.system一起使用会带来很大的安全风险,例如,密钥"foo; rm -rf /"会删除所有文件。

Python的subprocess模块更适合这种用途:

from subprocess import call
call(['cpobsn', key])

答案 2 :(得分:-1)

只需将密钥输入os.system

import json
import os

with open("/home/fusion809/OBS/home:fusion809:arch_extra/arch-wiki-man/package/package.json") as json_file:
    json_data = json.load(json_file)
    deps = json_data["dependencies"]
    for key, value in deps.items():
        print(key)
        os.system("cpobsn" + " " + key)